Add tray icon
This commit is contained in:
parent
1d3e58587d
commit
35b0d02af5
@ -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
|
||||
|
||||
|
||||
@ -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<DLGPROC>(mainDlgProc), reinterpret_cast<LPARAM>(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<Application*>(lParam);
|
||||
|
||||
SetWindowText(dlg, app->m_appName.c_str());
|
||||
// Set window icons
|
||||
SendMessage(dlg, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(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() {
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -9,3 +9,4 @@
|
||||
// Windows
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <Windows.h>
|
||||
#include <shellapi.h>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user