我在挂钩“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 调用正在为标题或我错过了任何重要的东西。非常感谢!
干杯,克里斯