From 35b0d02af55bf9dff784d3bbbd663fa86b18c86c Mon Sep 17 00:00:00 2001 From: Grayson Riffe Date: Thu, 4 Jun 2026 19:41:31 -0500 Subject: [PATCH] Add tray icon --- WatchfulEye/resource.rc | 4 +-- WatchfulEye/src/Application.cpp | 52 +++++++++++++++++++++++++++++++-- WatchfulEye/src/Application.h | 2 ++ WatchfulEye/src/pch.h | 1 + 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/WatchfulEye/resource.rc b/WatchfulEye/resource.rc index 0b44ecd..02a1d20 100644 --- a/WatchfulEye/resource.rc +++ b/WatchfulEye/resource.rc @@ -49,12 +49,12 @@ END // IDD_DIALOGMAIN DIALOGEX 0, 0, 300, 114 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_TOPMOST CAPTION "Dialog" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CTEXT "Time left on tester:",IDC_STATICTIME,17,27,266,60,SS_CENTERIMAGE + CTEXT "00:00",IDC_STATICTIME,17,27,266,60,SS_CENTERIMAGE CTEXT "Time left on tester:",IDC_STATICUPPER,54,4,190,22,SS_CENTERIMAGE END diff --git a/WatchfulEye/src/Application.cpp b/WatchfulEye/src/Application.cpp index 2b99c8a..255c8d5 100644 --- a/WatchfulEye/src/Application.cpp +++ b/WatchfulEye/src/Application.cpp @@ -5,6 +5,9 @@ #include "resource.h" +#define WM_TRAYICON WM_USER +#define IDM_EXIT 1001 + namespace watchfuleye { Application::Application(const char* appName, const char* appVersion) : m_appName(appName) @@ -15,10 +18,14 @@ namespace watchfuleye { } void Application::run() { + // Create dialog SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); m_mainDlg = CreateDialogParam(nullptr, MAKEINTRESOURCE(IDD_DIALOGMAIN), nullptr, reinterpret_cast(mainDlgProc), reinterpret_cast(this)); + // Create tray icon + createTrayIcon(); + ShowWindow(m_mainDlg, SW_SHOW); MSG msg = {}; @@ -28,20 +35,47 @@ namespace watchfuleye { BOOL CALLBACK Application::mainDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { static Application* app = nullptr; + static UINT taskbarCreatedMessage = 0; switch (msg) { case WM_INITDIALOG: { app = reinterpret_cast(lParam); SetWindowText(dlg, app->m_appName.c_str()); - // Set window icons + SendMessage(dlg, WM_SETICON, ICON_BIG, reinterpret_cast(LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)))); // Spawn in the lower right corner of the virtual screen (might be problematic in some cases) int cornerX = GetSystemMetrics(SM_XVIRTUALSCREEN) + GetSystemMetrics(SM_CXVIRTUALSCREEN); int cornerY = GetSystemMetrics(SM_YVIRTUALSCREEN) + GetSystemMetrics(SM_CYVIRTUALSCREEN); - SetWindowPos(dlg, nullptr, cornerX - 550, cornerY - 340, NULL, NULL, SWP_NOZORDER | SWP_NOSIZE); + taskbarCreatedMessage = RegisterWindowMessage("TaskbarCreated"); + + return TRUE; + } + + case WM_TRAYICON: { + if (LOWORD(lParam) == WM_RBUTTONDOWN) { + SetForegroundWindow(dlg); + + POINT cursor = {}; + GetCursorPos(&cursor); + + HMENU popupMenu = CreatePopupMenu(); + AppendMenu(popupMenu, MF_STRING, IDM_EXIT, "Exit"); + + TrackPopupMenu(popupMenu, NULL, cursor.x, cursor.y, NULL, dlg, nullptr); // Will block here. Might be problematic. + + DestroyMenu(popupMenu); + } + + return TRUE; + } + + case WM_COMMAND: { + if (HIWORD(wParam) == 0 && LOWORD(wParam) == IDM_EXIT) + DestroyWindow(dlg); + return TRUE; } @@ -56,9 +90,23 @@ namespace watchfuleye { } } + if (msg == taskbarCreatedMessage) + app->createTrayIcon(); + return FALSE; } + void Application::createTrayIcon() { + NOTIFYICONDATA iconData = {}; + iconData.cbSize = sizeof(iconData); + iconData.uVersion = NOTIFYICON_VERSION_4; + iconData.hWnd = m_mainDlg; + iconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; + iconData.uCallbackMessage = WM_TRAYICON; + iconData.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION)); + strcpy(iconData.szTip, m_appName.c_str()); + Shell_NotifyIcon(NIM_ADD, &iconData); + } Application::~Application() { diff --git a/WatchfulEye/src/Application.h b/WatchfulEye/src/Application.h index a0e94aa..0ad8aa7 100644 --- a/WatchfulEye/src/Application.h +++ b/WatchfulEye/src/Application.h @@ -11,6 +11,8 @@ namespace watchfuleye { private: static BOOL CALLBACK mainDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam); + void createTrayIcon(); + std::string m_appName, m_appVersion; HWND m_mainDlg; }; diff --git a/WatchfulEye/src/pch.h b/WatchfulEye/src/pch.h index f9ba044..88bb500 100644 --- a/WatchfulEye/src/pch.h +++ b/WatchfulEye/src/pch.h @@ -9,3 +9,4 @@ // Windows #define WIN32_LEAN_AND_MEAN #include +#include