Created
June 13, 2021 23:08
-
-
Save fecf/4eddd237eb045af8f595a775fe12b0e9 to your computer and use it in GitHub Desktop.
minimal windows app with tasktray icon
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
constexpr DWORD kNotifyTrayIcon = WM_APP + 100; | |
NOTIFYICONDATA g_nid; | |
HMENU g_hMenu; | |
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, | |
LPARAM lParam) { | |
switch (uMsg) { | |
case WM_CREATE: { | |
g_hMenu = CreatePopupMenu(); | |
MENUITEMINFO mii{}; | |
mii.cbSize = sizeof(MENUITEMINFO); | |
::InsertMenu(g_hMenu, 0, MF_BYPOSITION | MF_STRING, 1000, L"exit"); | |
g_nid = {}; | |
g_nid.cbSize = sizeof(NOTIFYICONDATA); | |
g_nid.hWnd = hWnd; | |
g_nid.uID = 1010; | |
g_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; | |
g_nid.uCallbackMessage = kNotifyTrayIcon; | |
SHSTOCKICONINFO sii{}; | |
sii.cbSize = sizeof(sii); | |
::SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, &sii); | |
g_nid.hIcon = sii.hIcon; | |
::lstrcpyW(g_nid.szTip, WND_NAME); | |
::Shell_NotifyIcon(NIM_ADD, &g_nid); | |
} break; | |
case WM_COMMAND: | |
switch (LOWORD(wParam)) { | |
case 1000: | |
::Shell_NotifyIcon(NIM_DELETE, &g_nid); | |
::DestroyMenu(g_hMenu); | |
g_hMenu = NULL; | |
::PostQuitMessage(0); | |
break; | |
} | |
break; | |
case kNotifyTrayIcon: | |
if (wParam == 1010) { | |
switch (lParam) { | |
case WM_RBUTTONDOWN: { | |
POINT pt; | |
::GetCursorPos(&pt); | |
::SetForegroundWindow(hWnd); | |
::TrackPopupMenu(g_hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, | |
(int)pt.x, (int)pt.y, 0, hWnd, 0); | |
break; | |
} | |
default: | |
break; | |
} | |
} | |
break; | |
case WM_DESTROY: | |
break; | |
case WM_CLOSE: | |
break; | |
case WM_QUIT: | |
break; | |
default: | |
return ::DefWindowProc(hWnd, uMsg, wParam, lParam); | |
} | |
return 0; | |
} | |
int main(int argc, char** argv) { | |
WNDCLASS wndClass = {0, WindowProc, 0, 0, hInstance, 0, 0, 0, 0, CLS_NAME}; | |
::RegisterClass(&wndClass); | |
HWND hWnd = ::CreateWindow(CLS_NAME, WND_NAME, 0, 0, 0, 0, 0, 0, 0, hInstance, 0); | |
MSG msg; | |
while (::GetMessage(&msg, 0, 0, 0)) { | |
::TranslateMessage(&msg); | |
::DispatchMessage(&msg); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment