diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2013-01-30 10:05:55 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-01-30 21:50:00 +0100 |
commit | 38f740e4de9a313fd33984bd54834c56dc2316c4 (patch) | |
tree | 11643b1aaa2f3dcdf56579760d7d15718f767424 | |
parent | 2be4d6ba022e1349b1b231ae852235f557c6fc20 (diff) |
Windows tray icon: Fix reinstalling after restart of Explorer.
Use a normal instead of a HWND_MESSAGE-window since the latter
do not receive the "TaskbarCreated" message. Provide an invokable
slot in the native interface to register a window class for that
purpose.
Task-number: QTBUG-29160
Change-Id: Ic25222d08d21867f7d882a9e19d8aaf50f3f47cf
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r-- | src/plugins/platforms/windows/qwindowsintegration.cpp | 12 | ||||
-rw-r--r-- | src/widgets/util/qsystemtrayicon_win.cpp | 32 |
2 files changed, 32 insertions, 12 deletions
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index aac28c36dc..4473b6b8a4 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -107,6 +107,9 @@ public: Q_INVOKABLE void *createMessageWindow(const QString &classNameTemplate, const QString &windowName, void *eventProc) const; + + Q_INVOKABLE QString registerWindowClass(const QString &classNameIn, void *eventProc) const; + bool asyncExpose() const; void setAsyncExpose(bool value); }; @@ -186,6 +189,15 @@ void *QWindowsNativeInterface::createMessageWindow(const QString &classNameTempl return hwnd; } +/*! + \brief Registers a unique window class with a callback function based on \a classNameIn. +*/ + +QString QWindowsNativeInterface::registerWindowClass(const QString &classNameIn, void *eventProc) const +{ + return QWindowsContext::instance()->registerWindowClass(classNameIn, (WNDPROC)eventProc); +} + bool QWindowsNativeInterface::asyncExpose() const { return QWindowsContext::instance()->asyncExpose(); diff --git a/src/widgets/util/qsystemtrayicon_win.cpp b/src/widgets/util/qsystemtrayicon_win.cpp index 8d8d731795..209fb206e1 100644 --- a/src/widgets/util/qsystemtrayicon_win.cpp +++ b/src/widgets/util/qsystemtrayicon_win.cpp @@ -166,21 +166,29 @@ extern "C" LRESULT QT_WIN_CALLBACK qWindowsTrayconWndProc(HWND hwnd, UINT messag } // Invoke a service of the native Windows interface to create -// a non-visible message window. +// a non-visible toplevel window to receive tray messages. +// Note: Message windows (HWND_MESSAGE) are not sufficient, they +// will not receive the "TaskbarCreated" message. static inline HWND createTrayIconMessageWindow() { - if (QPlatformNativeInterface *ni = QGuiApplication::platformNativeInterface()) { - void *hwnd = 0; - void *wndProc = reinterpret_cast<void *>(qWindowsTrayconWndProc); - if (QMetaObject::invokeMethod(ni, "createMessageWindow", Qt::DirectConnection, - Q_RETURN_ARG(void *, hwnd), - Q_ARG(QString, QStringLiteral("QTrayIconMessageWindowClass")), - Q_ARG(QString, QStringLiteral("QTrayIconMessageWindow")), - Q_ARG(void *, wndProc)) && hwnd) { - return reinterpret_cast<HWND>(hwnd); - } + QPlatformNativeInterface *ni = QGuiApplication::platformNativeInterface(); + if (!ni) + return 0; + // Register window class in the platform plugin. + QString className; + void *wndProc = reinterpret_cast<void *>(qWindowsTrayconWndProc); + if (!QMetaObject::invokeMethod(ni, "registerWindowClass", Qt::DirectConnection, + Q_RETURN_ARG(QString, className), + Q_ARG(QString, QStringLiteral("QTrayIconMessageWindowClass")), + Q_ARG(void *, wndProc))) { + return 0; } - return 0; + const wchar_t windowName[] = L"QTrayIconMessageWindow"; + return CreateWindowEx(0, (wchar_t*)className.utf16(), + windowName, WS_OVERLAPPED, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, (HINSTANCE)GetModuleHandle(0), NULL); } QSystemTrayIconSys::QSystemTrayIconSys(HWND hwnd, QSystemTrayIcon *object) |