From 94550e09b4c3f664611f8d044ce2a766b495cbf5 Mon Sep 17 00:00:00 2001 From: Quantum Date: Sat, 13 Sep 2025 15:04:03 -0400 Subject: [PATCH] [idd] helper: use CWindow helper to avoid global state --- idd/LGIddHelper/CWindow.cpp | 60 +++++++++++++++++++++++++++++ idd/LGIddHelper/CWindow.h | 20 ++++++++++ idd/LGIddHelper/LGIddHelper.vcxproj | 2 + idd/LGIddHelper/main.cpp | 24 ++---------- 4 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 idd/LGIddHelper/CWindow.cpp create mode 100644 idd/LGIddHelper/CWindow.h diff --git a/idd/LGIddHelper/CWindow.cpp b/idd/LGIddHelper/CWindow.cpp new file mode 100644 index 00000000..47b3b778 --- /dev/null +++ b/idd/LGIddHelper/CWindow.cpp @@ -0,0 +1,60 @@ +#include "CWindow.h" +#include +#include + +ATOM CWindow::s_atom = 0; +static HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL); + +bool CWindow::registerClass() +{ + WNDCLASSEX wx = {}; + wx.cbSize = sizeof(WNDCLASSEX); + wx.lpfnWndProc = wndProc; + wx.hInstance = hInstance; + wx.lpszClassName = L"LookingGlassIddHelper"; + wx.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + wx.hCursor = LoadCursor(NULL, IDC_ARROW); + wx.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE; + + s_atom = RegisterClassEx(&wx); + return s_atom; +} + +CWindow::CWindow() +{ + CreateWindowEx(0, MAKEINTATOM(s_atom), NULL, + 0, 0, 0, 0, 0, NULL, NULL, hInstance, this); +} + +LRESULT CWindow::wndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CWindow *self; + if (uMsg == WM_NCCREATE) + { + LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; + self = (CWindow*)lpcs->lpCreateParams; + self->m_hwnd = hwnd; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LPARAM) self); + } + else + { + self = (CWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + } + + if (self) + return self->handleMessage(uMsg, wParam, lParam); + else + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT CWindow::handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return DefWindowProc(m_hwnd, uMsg, wParam, lParam); +} + +CWindow::~CWindow() +{ + if (m_hwnd) + DestroyWindow(m_hwnd); +} diff --git a/idd/LGIddHelper/CWindow.h b/idd/LGIddHelper/CWindow.h new file mode 100644 index 00000000..ee441496 --- /dev/null +++ b/idd/LGIddHelper/CWindow.h @@ -0,0 +1,20 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN +#include +#include + +#define WM_NOTIFY_ICON (WM_USER) + +class CWindow { + static ATOM s_atom; + static LRESULT CALLBACK wndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + + HWND m_hwnd = NULL; + LRESULT handleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); + +public: + static bool registerClass(); + CWindow(); + ~CWindow(); +}; diff --git a/idd/LGIddHelper/LGIddHelper.vcxproj b/idd/LGIddHelper/LGIddHelper.vcxproj index 1dac348f..247a73e7 100644 --- a/idd/LGIddHelper/LGIddHelper.vcxproj +++ b/idd/LGIddHelper/LGIddHelper.vcxproj @@ -178,11 +178,13 @@ copy /Y "$(ProjectDir)VERSION" "$(SolutionDir)$(Platform)\$(Configuration)\LGIdd + + diff --git a/idd/LGIddHelper/main.cpp b/idd/LGIddHelper/main.cpp index d3da5994..ef239701 100644 --- a/idd/LGIddHelper/main.cpp +++ b/idd/LGIddHelper/main.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -11,6 +11,7 @@ using namespace Microsoft::WRL::Wrappers::HandleTraits; #include "CDebug.h" #include "VersionInfo.h" #include "CPipeClient.h" +#include "CWindow.h" #define ARRAY_SIZE(x) (sizeof(x) / sizeof*(x)) #define SVCNAME L"Looking Glass (IDD Helper)" @@ -31,11 +32,6 @@ static std::wstring l_exitEventName; static void Launch(); -LRESULT CALLBACK DummyWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hwnd, msg, wParam, lParam); -} - int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { g_debug.Init("looking-glass-iddhelper"); @@ -80,24 +76,13 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ return EXIT_FAILURE; } - WNDCLASSEX wx = {}; - wx.cbSize = sizeof(WNDCLASSEX); - wx.lpfnWndProc = DummyWndProc; - wx.hInstance = hInstance; - wx.lpszClassName = L"DUMMY_CLASS"; - wx.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); - wx.hCursor = LoadCursor(NULL, IDC_ARROW); - wx.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE; - ATOM aclass; - if (!(aclass = RegisterClassEx(&wx))) + if (!CWindow::registerClass()) { DEBUG_ERROR("Failed to register message window class"); return EXIT_FAILURE; } - HWND msgWnd = CreateWindowEx(0, MAKEINTATOM(aclass), NULL, - 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); + CWindow window; bool running = g_pipe.Init(); while (running) @@ -128,7 +113,6 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ } g_pipe.DeInit(); - DestroyWindow(msgWnd); return EXIT_SUCCESS; }