我爲了掛鉤的「user32.dll中」的「GetSysColor」功能相關的問題來修改掛鉤GetSysColor user32.dll中
COLOR_ACTIVECAPTION
COLOR_CAPTIONTEXT
COLOR_INACTIVECAPTION
COLOR_INACTIVECAPTIONTEXT
我的窗鉤類看起來是這樣的:
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電話打入標題或者我錯過了任何重要的東西。非常感謝你!
乾杯, 克里斯
這不是你如何定製你的標題。自定義標題的方法是處理WM_NCPAINT消息。 – 2012-08-06 20:58:54
不,對於我的應用程序來說,掛鉤是最好的解決方案。 OnNcPaint()與a)改變systemcolors或b)繪製自己的標題太慢而且很麻煩。 – CppChris 2012-08-06 21:36:56
雷蒙德是正確的。您提出的解決方案存在很多問題。如果您在收到WM_NCPAINT消息時運行正確的代碼,它確實不應該更快,但即使速度更快,它也不會正常工作。對於初學者來說,系統會嚴重緩存系統顏色的畫筆;它不需要通過調用GetSysColor函數在每次需要時重新創建它們。您將如何處理這些問題? – 2012-08-06 23:25:37