我在修改“user32.dll”的“GetSysColor”功能时遇到问题需要修改
COLOR_ACTIVECAPTION
COLOR_CAPTIONTEXT
COLOR_INACTIVECAPTION
COLOR_INACTIVECAPTIONTEXT
我的windows hook类看起来像这样:
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电话正在进行标题或者我错过了什么重要的事情。非常感谢你!
干杯, 克里斯
答案 0 :(得分:2)
1)想了想,你忘记了GetSysColorBrush
2)另一方面,还有其他系统库,可以由gdi使用,你可以尝试使用调试器断点来识别它们
3)就标题而言,它可以由DrawCaption
,GradientFill
绘制,也可以使用主题函数(XP或更高版本)绘制,如DrawThemeBackground
。