我一直在写一个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
的返回值吗? 您可能需要提升权限(管理员权限)。