-1

我在挂钩“user32.dll”的“GetSysColor”函数以进行修改时遇到问题

COLOR_ACTIVECAPTION
COLOR_CAPTIONTEXT
COLOR_INACTIVECAPTION
COLOR_INACTIVECAPTIONTEXT

我的 windows 钩子类如下所示:

CHook(const TCHAR * module, const TCHAR * procname, const void * pNewProc)
{        
    HINSTANCE hMod = GetModuleHandle(module);
    m_pProc = (BYTE*)GetProcAddress(hMod, procname);

    if (m_pProc)
    {
        for (int i = 0; i < 5; i++)
        {
            m_Storage[i] = m_pProc[i];
        }

        DWORD dwOldProtect;
        VirtualProtect(m_pProc, 5, PAGE_EXECUTE_READWRITE, & dwOldProtect);
        m_pProc[0] = 0xE9;
        *(unsigned*)(m_pProc + 1) = (unsigned)pNewProc - (unsigned)(m_pProc + 5);
    }
}

~CHook()
{
    if (m_pProc && (m_pProc[0] == 0xE9))
    {
        for (int i = 0; i < 5; i++)
        {
            m_pProc[i] = m_Storage[i];
        }
    }
}

private:
    BYTE* m_pProc;
    BYTE  m_Storage[5];

我写了一个自定义的 getsyscolor 方法

static COLORREF WINAPI GetCustomSysColor(int nIndex)
{
    return RGB(0xFF, 0x00, 0x00);
}

进行测试,如果每条消息都通过该功能进行路由(那么最后一切都应该是红色的)。我通过安装它

CHook theHook("user32.dll", "GetSysColor", GetCustomSysColor);

不幸的是,并不是所有的东西都被涂成红色,只有一些东西,比如图标等。但开头提到的颜色是以前的系统设置——标题仍然是蓝色的,文字是白色的。我什至对其进行了调试,并且标题的颜色到达了 GetCustomSysColors 方法。

也许有人知道是否有另一个 winapi 调用正在为标题或我错过了任何重要的东西。非常感谢!

干杯,克里斯

4

1 回答 1

2

1)以为,你忘了GetSysColorBrush

2)另一边,还有其他系统库,可能是gdi用到的,可以尝试使用调试器断点来识别

3)关于标题,它可以由DrawCaptionGradientFill,或具有主题功能(XP或更高版本)如DrawThemeBackground

于 2012-08-06T18:39:59.340 回答