2012-08-06 81 views
-1

我爲了掛鉤的「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電話打入標題或者我錯過了任何重要的東西。非常感謝你!

乾杯, 克里斯

+1

這不是你如何定製你的標題。自定義標題的方法是處理WM_NCPAINT消息。 – 2012-08-06 20:58:54

+0

不,對於我的應用程序來說,掛鉤是最好的解決方案。 OnNcPaint()與a)改變systemcolors或b)繪製自己的標題太慢而且很麻煩。 – CppChris 2012-08-06 21:36:56

+0

雷蒙德是正確的。您提出的解決方案存在很多問題。如果您在收到WM_NCPAINT消息時運行正確的代碼,它確實不應該更快,但即使速度更快,它也不會正常工作。對於初學者來說,系統會嚴重緩存系統顏色的畫筆;它不需要通過調用GetSysColor函數在每次需要時重新創建它們。您將如何處理這些問題? – 2012-08-06 23:25:37

回答

2

1)認爲,你對對方忘記GetSysColorBrush

2),還有其他的系統庫,它可以通過GDI使用,你可以嘗試使用調試器斷點以識別它們

3)作爲關於標題,它可能被繪製DrawCaption,GradientFill或與主題功能(XP或更高),如DrawThemeBackground

+0

謝謝!我明天會試試這個。 – CppChris 2012-08-06 21:35:50