2

我正在尝试使用全局 shell 挂钩来侦听 Windows 创建和销毁的事件,但似乎我的程序只是为本地线程注册了被销毁的事件。根本没有创造事件,也绝对不是我认为应该是的全球事件。

我花了最后一天搜索谷歌以及 codeguru、codeproject 和 msdn,但在我看来我做得对,虽然我显然不是。有人可以帮我指出正确的方向吗?

#pragma data_seg(".SHARE")
HWND hWndServer = NULL;
HHOOK g_shell_hook = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.SHARE,RWS")

TASKBAR_API int StartShellHook(HWND hWnd)
{
    g_shell_hook = SetWindowsHookEx(WH_SHELL, ShellProc, g_dll_module_handle, 0);
    if(g_shell_hook)
        hWndServer = hWnd;
    return (g_shell_hook != NULL);
}

这是我连接到 shell 的代码,这对我来说似乎都是正确的,但同样,它没有给出正确的输出。现在,ShellProc 函数只是设置为在窗口创建和销毁消息上进行微不足道的变量递增,只是为了在一行上放置一个断点,但程序只为本地窗口的销毁消息打断点。再次,任何帮助都会很棒,非常感谢您。

4

2 回答 2

0

可能发生这种情况的一个原因是您编译了一个 32 位 DLL,并且您正试图在 64 位操作系统上运行它。不过,总的来说,您想通过安装此挂钩来完成什么?钩子很难正确处理,如果您在处理程序中花费的时间过长,可能会被取消注册。

于 2009-11-22T09:44:13.033 回答
0

您可以尝试使用窗口作为外壳挂钩(如果您的应用程序中某处有 HWND 句柄):RegisterShellHookWindow。这样,您将通过窗口的消息泵接收有关已创建和已销毁窗口的全局 shell 通知。

于 2010-11-16T17:50:21.533 回答