如何处理Qt托盘应用程序中的会话更改通知



我在Qt托盘应用程序中处理会话状态通知(如用户登录/注销/锁定等(时遇到问题。在通常的Qt应用程序中,我可以使用hWnd=effectiveWinId()调用WTSRegisterSessionNotification并重新实现nativeEvent,如下所示:

bool EventListener::nativeEvent(const QByteArray &eventType, void *message, long *result)
{    
    MSG* msg = reinterpret_cast<MSG*>(message);
    switch(msg->message)
    {
        case WM_WTSSESSION_CHANGE:
            ...
    }
    ...
}

但是在托盘应用程序中这是不可能的,因为QSystemTrayIcon不会继承QWidget并且我没有任何窗口句柄。

是否可以在不创建假隐形窗口的情况下解决问题?

我创建了一个带有 WinAPI 函数的假隐形窗口,用于通知处理。下面是一个简短的示例:

QObject *ni = reinterpret_cast<QObject*>(QGuiApplication::platformNativeInterface() );
// Register window class in the platform plugin.
QString className;
void *wndProc = reinterpret_cast<void *>(msgWndProc);
QMetaObject::invokeMethod(ni, "registerWindowClass", Qt::DirectConnection,
                               Q_RETURN_ARG(QString, className),
                               Q_ARG(QString, QStringLiteral("MessageFakeWindowClass")),
                               Q_ARG(void *, wndProc));
const wchar_t windowName[] = L"MessageFakeWindow";
HWND msgWindow_ = CreateWindowEx(0, (wchar_t*)className.utf16(),
                      windowName, WS_OVERLAPPED,
                      0, 0,
                      0, 0,
                      HWND_DESKTOP, nullptr, (HINSTANCE)GetModuleHandle(0), nullptr);
WTSRegisterSessionNotification(msgWindow_, NOTIFY_FOR_THIS_SESSION);

相关内容

  • 没有找到相关文章

最新更新