无法使用SetWindowsHookEx设置shellhook

Unable to set shellhook using SetWindowsHookEx

本文关键字:设置 shellhook SetWindowsHookEx      更新时间:2023-10-16

我不确定问题是什么,我正在注册一个钩子并遵循文档。我都读过了,但不知道什么原因,不管用。它会告诉我钩子已经安装,但是它永远不会被调用。

我使用的代码如下:

#include <Windows.h>
#include <wchar.h>
HHOOK hHook;
LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam, LPARAM lParam)
{   
    wprintf( TEXT("ShellProc called with iCode: %drn"), nCode );
    if( nCode == HSHELL_WINDOWCREATED )
    {
        HWND hWnd = (HWND)wParam;
        wprintf( TEXT("New window created: %drn"), 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 hookrn") );      
    }
    else
    {
        wprintf( TEXT("Windows hook set.rn") );
        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;
}

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

当shell应用程序即将被激活时,当创建或销毁顶层窗口时,系统调用WH_SHELL钩子子程

你什么都没做。

在一个侧面说明,你不应该调用SystemParametersInfo(SPI_SETMINIMIZEDMETRICS),除非你的应用程序打算取代Explorer.exe作为管理Windows桌面的注册Shell应用程序。