我一直在编写DLL,并尝试获取有关用户锁定屏幕的通知。我发现WM_WTSSESSION_CHANGE将适合我的需要,但我无法在我的图书馆中阅读此消息,
此外,当我用spyxx.exe监视应用程序时
我可以看到WM_WTSSESSION_CHANGE
消息已发布。
任何人都可以看看并说出我做错了什么?
一些必需品清单:
设置WndProc回调:
HHOOK hook = SetWindowsHookEx(
WH_CALLWNDPROC,
(HOOKPROC) __monitor,
hInstance,
GetCurrentThreadId());
事件通知注册表:
WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_THIS_SESSION);
回调函数:
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 ..
}
答案 0 :(得分:2)
您不需要Windows挂钩作为回调,任何带有消息循环的窗口过程都可以解决问题。使用正常方法。
您是否检查了WTSRegisterSessionNotification
的返回值?
您可能需要提升权限(管理员权限)。
答案 1 :(得分:2)
看起来你遇到了两个问题。第一个是传递给SetWindowsHookEx
的线程ID必须与主要顶级窗口运行的线程的线程ID相同。修复该问题将意味着将在同一个线程中调用钩子函数窗户。如果你需要在另一个线程中处理它,你必须让钩子函数发信号通知另一个线程。
第二个问题是WH_CALLWNDPROC
挂钩功能似乎没有发送WM_WTSSESSION_CHANGE
个消息,可能是因为它已发布而不是已发送。但是,使用WH_GETMESSAGE
挂钩可以正常工作。