Articles of winapi

我需要做些什么来使我的WH_SHELL或WH_CBT挂钩程序从其他进程接收事件?

我试图使用SetWindowsHookEx来build立一个WH_SHELL挂钩来获得系统范围的HSHELL_WINDOWCREATED和HSHELL_WINDOWDESTROYED事件的通知。 我把0传递给最后一个dwThreadId参数,根据文档 , 这个参数应该“将钩子过程与调用线程在同一桌面上运行的所有现有线程相关联”。 我也传递了我的DLL( HInstance在Delphi中)的句柄hMod参数,我所看到的所有例子。 然而,我只能得到我自己的应用程序创build的窗口的通知,而且往往会导致桌面进程一旦closures我的应用程序就会熄灭。 在你问之前,我打电话给UnhookWindowsHookEx 。 我也总是从我的处理程序中调用CallNextHookEx 。 我从一个有限的用户帐户运行我的testing应用程序,但到目前为止,我还没有发现任何暗示,这将发挥作用…(虽然这实际上令我惊讶) AFAICT,我做了所有的书(显然我没有,但到目前为止,我不知道在哪里)。 我正在使用delphi(2007年),但这应该不是真的,我想。 编辑:也许我应该提到这之前:我下载并尝试了几个例子(虽然不幸的是没有那么多的delphi – 特别是没有WH_SHELL或WH_CBT )。 虽然他们不会像我的testing应用程序那样崩溃系统,但是他们仍然不会捕获来自其他进程的事件(尽pipe我可以使用ProcessExplorervalidation它们是否可以加载到其中)。 所以看起来我的系统configuration有问题,或者这个例子错了,或者根本无法从其他进程捕获事件。 任何人都可以启发我吗? 编辑2:好的,这是我的testing项目的来源。 包含挂钩过程的DLL: library HookHelper; uses Windows; {$R *.res} type THookCallback = procedure(ACode, AWParam, ALParam: Integer); stdcall; var WndHookCallback: THookCallback; Hook: HHook; function HookProc(ACode, AWParam, ALParam: Integer): Integer; stdcall; begin Result := CallNextHookEx(Hook, ACode, AWParam, […]