Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 挂接user32.dll中的GetSysColor_C++_Winapi_Mfc_Hook - Fatal编程技术网

C++ 挂接user32.dll中的GetSysColor

C++ 挂接user32.dll中的GetSysColor,c++,winapi,mfc,hook,C++,Winapi,Mfc,Hook,我挂接user32.dll的GetSysColor函数以修改 COLOR_ACTIVECAPTION COLOR_CAPTIONTEXT COLOR_INACTIVECAPTION COLOR_INACTIVECAPTIONTEXT 我的windows钩子类如下所示: CHook(const TCHAR * module, const TCHAR * procname, const void * pNewProc) { HINSTANCE hMod = GetModul

我挂接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];
为了测试,如果每条消息都通过该函数进行路由,那么最后所有消息都应该是红色的。我是通过

CHook theHook("user32.dll", "GetSysColor", GetCustomSysColor);
不幸的是,并不是所有的东西都被涂成红色,只有一些东西像图标等。但是开始提到的颜色是以前的系统设置-标题仍然是用白色文本涂成蓝色。我甚至调试了它,标题的颜色到达了GetCustomSysColors方法

也许有人知道是否有另一个winapi调用正在进行,或者我是否遗漏了任何重要的内容。多谢各位

干杯, 克里斯想,你忘了

2另一方面,gdi可能会使用其他系统库,您可以尝试使用调试器断点来识别它们


3关于标题,可以使用DrawCaption、GradientFill绘制,也可以使用主题功能XP或更高版本,如DrawThemeBackground。

这不是自定义标题的方式。自定义标题的方法是处理WM_NCPAINT message.No。对于我的应用程序,挂钩是最好的解决方案。OnNcPaint使用更改的系统颜色或b绘制您自己的标题太慢和繁琐。否。雷蒙德是对的。你提出的解决方案有很多问题。如果您正确编写了接收到WM_NCPAINT消息时运行的代码,那么速度应该不会更快,但即使更快,也无法正常工作。对于初学者来说,系统会大量缓存笔刷的系统颜色;它不需要通过调用GetSysColor函数在每次需要它们时重新创建它们。。你打算怎么做?系统不会调用GetSysColor来获取颜色。它已经知道颜色是什么了。如果启用了视觉样式,则标题甚至不是颜色。感谢系统笔刷的提示。我以后会进一步调查的。谢谢!我明天试试这个。
CHook theHook("user32.dll", "GetSysColor", GetCustomSysColor);