From 67e1574d205f0b8ca601afd5364e83e4b0aad9e9 Mon Sep 17 00:00:00 2001 From: Quantum Date: Sat, 13 Sep 2025 15:44:47 -0400 Subject: [PATCH] [idd] helper: add notification icon --- idd/LGIddHelper/CWindow.cpp | 40 +++++++++++++++++++++++++++++++++++-- idd/LGIddHelper/CWindow.h | 6 ++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/idd/LGIddHelper/CWindow.cpp b/idd/LGIddHelper/CWindow.cpp index 47b3b778..9f92643b 100644 --- a/idd/LGIddHelper/CWindow.cpp +++ b/idd/LGIddHelper/CWindow.cpp @@ -3,10 +3,15 @@ #include ATOM CWindow::s_atom = 0; +UINT CWindow::s_taskbarCreated = 0; static HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); bool CWindow::registerClass() { + s_taskbarCreated = RegisterWindowMessage(L"TaskbarCreated"); + if (!s_taskbarCreated) + DEBUG_WARN_HR(GetLastError(), "RegisterWindowMessage(TaskbarCreated)"); + WNDCLASSEX wx = {}; wx.cbSize = sizeof(WNDCLASSEX); wx.lpfnWndProc = wndProc; @@ -21,7 +26,7 @@ bool CWindow::registerClass() return s_atom; } -CWindow::CWindow() +CWindow::CWindow() : m_iconData({ 0 }) { CreateWindowEx(0, MAKEINTATOM(s_atom), NULL, 0, 0, 0, 0, 0, NULL, NULL, hInstance, this); @@ -50,7 +55,38 @@ LRESULT CWindow::wndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) LRESULT CWindow::handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { - return DefWindowProc(m_hwnd, uMsg, wParam, lParam); + switch (uMsg) + { + case WM_CREATE: + onCreate(); + return 0; + default: + if (s_taskbarCreated && uMsg == s_taskbarCreated) + { + registerIcon(); + return 0; + } + return DefWindowProc(m_hwnd, uMsg, wParam, lParam); + } +} + +LRESULT CWindow::onCreate() +{ + registerIcon(); + return 0; +} + +void CWindow::registerIcon() +{ + m_iconData.cbSize = sizeof m_iconData; + m_iconData.hWnd = m_hwnd; + m_iconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + m_iconData.uCallbackMessage = WM_NOTIFY_ICON; + m_iconData.hIcon = LoadIcon(hInstance, IDI_APPLICATION); + StringCbCopy(m_iconData.szTip, sizeof m_iconData.szTip, L"Looking Glass (IDD)"); + + if (!Shell_NotifyIcon(NIM_ADD, &m_iconData)) + DEBUG_ERROR_HR(GetLastError(), "Shell_NotifyIcon(NIM_ADD)"); } CWindow::~CWindow() diff --git a/idd/LGIddHelper/CWindow.h b/idd/LGIddHelper/CWindow.h index ee441496..f507dfcd 100644 --- a/idd/LGIddHelper/CWindow.h +++ b/idd/LGIddHelper/CWindow.h @@ -8,13 +8,19 @@ class CWindow { static ATOM s_atom; + static UINT s_taskbarCreated; static LRESULT CALLBACK wndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HWND m_hwnd = NULL; + NOTIFYICONDATA m_iconData; LRESULT handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); + LRESULT onCreate(); + void registerIcon(); public: static bool registerClass(); CWindow(); ~CWindow(); + + HWND hwnd() { return m_hwnd; } };