在user32.dll中挂钩GetSysColor

时间:2012-08-06 17:58:04

标签: c++ winapi mfc hook

我在修改“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电话正在进行标题或者我错过了什么重要的事情。非常感谢你!

干杯, 克里斯

1 个答案:

答案 0 :(得分:2)

1)想了想,你忘记了GetSysColorBrush

2)另一方面,还有其他系统库,可以由gdi使用,你可以尝试使用调试器断点来识别它们

3)就标题而言,它可以由DrawCaptionGradientFill绘制,也可以使用主题函数(XP或更高版本)绘制,如DrawThemeBackground