在Windows 7 64位不接收WM_WTSSESSION_CHANGE

我一直在写一个DLL,并试图得到关于用户locking屏幕的通知。 我发现WM_WTSSESSION_CHANGE将适合我的需要,但我不能在我的库中读取此消息,此外,当我用spyxx.exe扫描应用程序时,我可以看到WM_WTSSESSION_CHANGE消息已发布。

任何人都可以看看,说我做错了什么?

一些要领列表:

设置WndProccallback:

 HHOOK hook = SetWindowsHookEx( WH_CALLWNDPROC, (HOOKPROC) __monitor, hInstance, GetCurrentThreadId()); 

事件通知registry:

 WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_THIS_SESSION); 

callback函数:

 LRESULT CALLBACK __monitor( int code, WPARAM wParam, LPARAM lParam) { CWPSTRUCT *msg= (CWPSTRUCT *) lParam; // have verified that the statement : hwnd == msg->hwnd is true switch (msg->message) { // ... case WM_DESTROY: //... this case is handled OK break; case WM_WTSSESSION_CHANGE: //... FAIL, never enters here break; } // CallNextHookEx .. } 

看起来你遇到了两个问题。 第一个是你传递给SetWindowsHookEx的线程ID必须和你的主要顶级窗口运行的线程的线程ID相同。解决这个问题意味着钩子函数将在与窗口相同的线程中被调用。 如果你需要在另一个线程中处理它,你必须让钩子函数发出另一个线程的信号。

第二个是WH_CALLWNDPROC挂钩函数看起来没有被传递WM_WTSSESSION_CHANGE消息,可能是因为它被发送而不是发送。 然而使用WH_GETMESSAGE钩子。

你不需要一个Windows钩子作为回调,任何具有消息循环的窗口过程都可以做到这一点。 使用正常的方法。

你检查了WTSRegisterSessionNotification的返回值吗? 您可能需要提升权限(管理员权限)。