0

何が問題なのかわかりません。フックを登録し、ドキュメントに従っています。全部読んだのですが、なぜかうまくいきません。フックがインストールされたことが通知されますが、呼び出されることはありません。

私が使用しているコードは次のとおりです。

#include <Windows.h>
#include <wchar.h>

HHOOK hHook;

LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam)
{   
    wprintf( TEXT("ShellProc called with iCode: %d\r\n"), nCode );

    if( nCode == HSHELL_WINDOWCREATED )
    {
        HWND hWnd = (HWND)wParam;

        wprintf( TEXT("New window created: %d\r\n"), hWnd );
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int main()
{
    hHook = SetWindowsHookEx(WH_SHELL, (HOOKPROC)ShellProc, NULL, GetCurrentThreadId());

    if( hHook == NULL )
    {
        wprintf( TEXT("Failed to set windows hook\r\n") );      
    }
    else
    {
        wprintf( TEXT("Windows hook set.\r\n") );
        MINIMIZEDMETRICS st;
        st.cbSize = sizeof(MINIMIZEDMETRICS);
        st.iArrange = ARW_HIDE;
        BOOL ret;
        ret = SystemParametersInfo(
            SPI_SETMINIMIZEDMETRICS,
            sizeof(MINIMIZEDMETRICS),
            &st,
            0);

    }

    do
    {
        Sleep(100);
    } while( !GetAsyncKeyState(VK_F5) );

    if( hHook != NULL )
        UnhookWindowsHookEx(hHook);

    return 0;
}
4

1 に答える 1

3

呼び出し元のスレッドのみにフックをインストールしており、そのスレッドはフックが呼び出される原因となるようなことを何もしていません。 ドキュメントを読む

シェル アプリケーションがアクティブ化されようとしているとき、および最上位ウィンドウが作成または破棄されたときに、システムは WH_SHELL フック プロシージャを呼び出します。

あなたはそれをしていません。

SystemParametersInfo(SPI_SETMINIMIZEDMETRICS)余談ですが、Windows デスクトップを管理するための登録済みシェル アプリとして Explorer.exe を置き換えることをアプリが意図していない限り、呼び出しを行うべきではありません。

于 2013-05-31T23:52:25.317 に答える