Changed NOTIFYICONDATA structure to version 4 (Vista and later).

This commit is contained in:
2024-01-20 21:37:22 +03:00
parent 016e42bbf2
commit 3e8b3b906b
2 changed files with 54 additions and 33 deletions

View File

@@ -55,12 +55,10 @@ MENUITEMINFOW mii = { 0 };
LPVOID szWinTitleBuffer = nullptr; LPVOID szWinTitleBuffer = nullptr;
LPVOID szWinClassBuffer = nullptr; LPVOID szWinClassBuffer = nullptr;
// {2D7B7F30-4B5F-4380-9807-57D7A2E37F6C}
// static const GUID guid = { 0x2d7b7f30, 0x4b5f, 0x4380, { 0x98, 0x7, 0x57, 0xd7, 0xa2, 0xe3, 0x7f, 0x6c } };
// Forward declarations of functions included in this code module: // Forward declarations of functions included in this code module:
VOID HandlingTrayIcon(); VOID HandlingTrayIcon();
VOID ShowError(UINT, LPCWSTR); VOID ShowError(UINT, LPCWSTR);
VOID ShowPopupMenu(HWND, POINT);
BOOL IsWindowApprooved(HWND); BOOL IsWindowApprooved(HWND);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK KeyboardHookProc(int, WPARAM, LPARAM); LRESULT CALLBACK KeyboardHookProc(int, WPARAM, LPARAM);
@@ -279,11 +277,11 @@ LRESULT CALLBACK WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lPar
nid.cbSize = sizeof(NOTIFYICONDATAW); nid.cbSize = sizeof(NOTIFYICONDATAW);
nid.hWnd = hMainWnd; nid.hWnd = hMainWnd;
nid.uVersion = NOTIFYICON_VERSION; nid.uVersion = NOTIFYICON_VERSION_4;
nid.uCallbackMessage = WM_WCW; nid.uCallbackMessage = WM_WCW;
nid.hIcon = hIconSmall; nid.hIcon = hIconSmall;
nid.uID = IDI_TRAYICON; nid.uID = IDI_TRAYICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_SHOWTIP;
StringCchCopyW(nid.szTip, _countof(nid.szTip), szTitle); StringCchCopyW(nid.szTip, _countof(nid.szTip), szTitle);
uMsgRestore = RegisterWindowMessageW(L"TaskbarCreated"); uMsgRestore = RegisterWindowMessageW(L"TaskbarCreated");
@@ -339,27 +337,31 @@ LRESULT CALLBACK WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lPar
case WM_WCW: // Popup menu handler case WM_WCW: // Popup menu handler
{ {
if (IDI_TRAYICON == wParam && (WM_RBUTTONDOWN == lParam || WM_LBUTTONDOWN == lParam)) if (WM_CONTEXTMENU == LOWORD(lParam))
{ {
logger.Out(L"%s(%d): Entering the WM_WCW message handler", TEXT(__FUNCTION__), __LINE__); logger.Out(L"%s(%d): Recived WM_CONTEXTMENU message", TEXT(__FUNCTION__), __LINE__);
POINT pt; POINT pt{ GET_X_LPARAM(wParam), GET_Y_LPARAM(wParam) };
GetCursorPos(&pt); ShowPopupMenu(hMainWnd, pt);
SetForegroundWindow(hMainWnd); }
break;
}
UINT uFlags = TPM_RETURNCMD | TPM_RIGHTBUTTON; case WM_COMMAND:
GetSystemMetrics(SM_MENUDROPALIGNMENT) != 0 ? uFlags |= TPM_RIGHTALIGN : uFlags |= TPM_LEFTALIGN; {
int wmId = LOWORD(wParam);
int idMenu = TrackPopupMenuEx(hPopup, uFlags, pt.x, pt.y, hMainWnd, NULL); // Parse the menu selections:
PostMessageW(hMainWnd, WM_NULL, 0, 0); switch (wmId)
if (ID_POPUPMENU_ICON == idMenu) {
case ID_POPUPMENU_ICON:
{ {
logger.Out(L"%s(%d): Pressed the 'Hide icon' menuitem", TEXT(__FUNCTION__), __LINE__); logger.Out(L"%s(%d): Pressed the 'Hide icon' menuitem", TEXT(__FUNCTION__), __LINE__);
fShowIcon = FALSE; fShowIcon = FALSE;
HandlingTrayIcon(); HandlingTrayIcon();
break;
} }
if (ID_POPUPMENU_AREA == idMenu) case ID_POPUPMENU_AREA:
{ {
logger.Out(L"%s(%d): Pressed the 'Use workarea' menuitem", TEXT(__FUNCTION__), __LINE__); logger.Out(L"%s(%d): Pressed the 'Use workarea' menuitem", TEXT(__FUNCTION__), __LINE__);
@@ -367,8 +369,11 @@ LRESULT CALLBACK WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lPar
bWorkArea ? mii.fState = MFS_CHECKED : mii.fState = MFS_UNCHECKED; bWorkArea ? mii.fState = MFS_CHECKED : mii.fState = MFS_UNCHECKED;
SetMenuItemInfoW(hPopup, ID_POPUPMENU_AREA, FALSE, &mii); SetMenuItemInfoW(hPopup, ID_POPUPMENU_AREA, FALSE, &mii);
logger.Out(L"%s(%d): Changed 'Use workarea' option to %s", TEXT(__FUNCTION__), __LINE__, bWorkArea ? L"True" : L"False"); logger.Out(L"%s(%d): Changed 'Use workarea' option to %s", TEXT(__FUNCTION__), __LINE__, bWorkArea ? L"True" : L"False");
break;
} }
if (ID_POPUPMENU_HELP == idMenu && !bKPressed) case ID_POPUPMENU_HELP:
{
if (!bKPressed)
{ {
logger.Out(L"%s(%d): Pressed the 'Help' menuitem", TEXT(__FUNCTION__), __LINE__); logger.Out(L"%s(%d): Pressed the 'Help' menuitem", TEXT(__FUNCTION__), __LINE__);
@@ -378,7 +383,11 @@ LRESULT CALLBACK WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lPar
MessageBoxW(hMainWnd, szHelp, szTitle, MB_OK | MB_ICONINFORMATION); MessageBoxW(hMainWnd, szHelp, szTitle, MB_OK | MB_ICONINFORMATION);
bKPressed = FALSE; bKPressed = FALSE;
} }
if (ID_POPUPMENU_ABOUT == idMenu && !bKPressed) break;
}
case ID_POPUPMENU_ABOUT:
{
if (!bKPressed)
{ {
logger.Out(L"%s(%d): Pressed the 'About' menuitem", TEXT(__FUNCTION__), __LINE__); logger.Out(L"%s(%d): Pressed the 'About' menuitem", TEXT(__FUNCTION__), __LINE__);
@@ -386,14 +395,15 @@ LRESULT CALLBACK WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lPar
DialogBoxParamW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(IDD_ABOUTBOX), hMainWnd, static_cast<DLGPROC>(About), 0L); DialogBoxParamW(GetModuleHandleW(NULL), MAKEINTRESOURCEW(IDD_ABOUTBOX), hMainWnd, static_cast<DLGPROC>(About), 0L);
bKPressed = FALSE; bKPressed = FALSE;
} }
if (ID_POPUPMENU_EXIT == idMenu) break;
}
case ID_POPUPMENU_EXIT:
{ {
logger.Out(L"%s(%d): Pressed the 'Exit' menuitem", TEXT(__FUNCTION__), __LINE__); logger.Out(L"%s(%d): Pressed the 'Exit' menuitem", TEXT(__FUNCTION__), __LINE__);
DestroyWindow(hMainWnd); DestroyWindow(hMainWnd);
break;
} }
logger.Out(L"%s(%d): Exit from the WM_WCW message handler", TEXT(__FUNCTION__), __LINE__);
} }
break; break;
} }
@@ -423,9 +433,10 @@ LRESULT CALLBACK WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lPar
Shell_NotifyIconW(NIM_ADD, &nid); Shell_NotifyIconW(NIM_ADD, &nid);
break; break;
} }
}
}
return DefWindowProcW(hMainWnd, message, wParam, lParam); return DefWindowProcW(hMainWnd, message, wParam, lParam);
}
}
return 0;
} }
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
@@ -659,6 +670,15 @@ VOID ShowError(UINT uID, LPCWSTR szAppTitle)
MessageBoxW(NULL, szErrorText, szAppTitle, MB_OK | MB_ICONERROR | MB_TOPMOST); MessageBoxW(NULL, szErrorText, szAppTitle, MB_OK | MB_ICONERROR | MB_TOPMOST);
} }
VOID ShowPopupMenu(HWND hMainWnd, POINT pt)
{
SetForegroundWindow(hMainWnd);
UINT uFlags = TPM_RIGHTBUTTON;
GetSystemMetrics(SM_MENUDROPALIGNMENT) != 0 ? uFlags |= TPM_RIGHTALIGN : uFlags |= TPM_LEFTALIGN;
TrackPopupMenuEx(hPopup, uFlags, pt.x, pt.y, hMainWnd, NULL);
PostMessageW(hMainWnd, WM_NULL, 0, 0);
}
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{ {
INITCOMMONCONTROLSEX icex = { 0 }; INITCOMMONCONTROLSEX icex = { 0 };

View File

@@ -46,6 +46,7 @@
#include <vector> #include <vector>
#include <strsafe.h> #include <strsafe.h>
#include <windows.h> #include <windows.h>
#include <windowsx.h>
#include <wininet.h> #include <wininet.h>
#include <shellapi.h> #include <shellapi.h>
#include <CommCtrl.h> #include <CommCtrl.h>