-1

変更するために「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];

カスタムの getsyscolor メソッドを作成しました

static COLORREF WINAPI GetCustomSysColor(int nIndex)
{
    return RGB(0xFF, 0x00, 0x00);
}

すべてのメッセージがその関数を介してルーティングされるかどうかをテストします (すべてが最後に赤くなるはずです)。経由でインストールしました

CHook theHook("user32.dll", "GetSysColor", GetCustomSysColor);

残念ながら、すべてが赤く塗られるわけではなく、アイコンなどの一部だけです。しかし、最初に述べた色は以前のシステム設定です。キャプションは依然として青く、白いテキストが表示されます。私もそれをデバッグし、キャプションの色が GetCustomSysColors メソッドに到着しました。

キャプションのために別の winapi 呼び出しが行われているのか、それとも重要なことを見逃していないのか、誰かが知っているかもしれません。どうもありがとうございました!

乾杯、クリス

4

1 に答える 1

2

1) 思った、GetSysColorBrushを忘れた

2)反対側には、gdiで使用される可能性のある他のシステムライブラリがあります。デバッガーのブレークポイントを使用してそれらを特定することができます

3) キャプションについてはDrawCaption、 、GradientFill、または のようなテーマ機能 (XP 以上) でペイントできますDrawThemeBackground

于 2012-08-06T18:39:59.340 に答える