在Windows 7 64位中没有收到WM_WTSSESSION_CHANGE

时间:2014-08-19 14:30:34

标签: c++ windows winapi wndproc

我一直在编写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 ..
}

2 个答案:

答案 0 :(得分:2)

您不需要Windows挂钩作为回调,任何带有消息循环的窗口过程都可以解决问题。使用正常方法。

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

答案 1 :(得分:2)

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

第二个问题是WH_CALLWNDPROC挂钩功能似乎没有发送WM_WTSSESSION_CHANGE个消息,可能是因为它已发布而不是已发送。但是,使用WH_GETMESSAGE挂钩可以正常工作。