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

您只是将钩子安装到调用线程中,然后该线程没有做任何会导致调用钩子的事情。 阅读文档

当 shell 应用程序即将被激活以及创建或销毁顶级窗口时,系统调用 WH_SHELL 挂钩过程

你没有做任何事情。

SystemParametersInfo(SPI_SETMINIMIZEDMETRICS)附带说明一下,除非您的应用程序打算将 Explorer.exe 替换为已注册的用于管理 Windows 桌面的 Shell 应用程序,否则您根本不应该调用。

于 2013-05-31T23:52:25.317 回答