无法使用SetWindowsHookEx设置shellhook

时间:2013-05-31 22:43:05

标签: c++ windows

我不确定问题是什么,我正在注册一个钩子并遵循文档。我已经读完了所有内容,但由于某些原因它无法正常工作。它将告诉我挂钩已安装,但随后它将永远不会被调用。

我使用的代码如下:

#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;
}

1 个答案:

答案 0 :(得分:3)

您只是将挂钩安装到调用线程中,然后该线程没有执行任何会导致调用挂钩的操作。 Read the documentation

  

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

你没有做任何事情。

另外,除非您的应用程序旨在将Explorer.exe替换为用于管理Windows桌面的已注册Shell应用程序,否则您不应该调用SystemParametersInfo(SPI_SETMINIMIZEDMETRICS)