[KBSWITCH] Fix notification icon handle leak

This commit is contained in:
Katayama Hirofumi MZ 2022-08-24 12:18:59 +09:00
parent eca08cfe98
commit 82db0523e4

View file

@ -28,6 +28,7 @@ HINSTANCE hInst;
HANDLE hProcessHeap; HANDLE hProcessHeap;
HMODULE hDllLib; HMODULE hDllLib;
ULONG ulCurrentLayoutNum = 1; ULONG ulCurrentLayoutNum = 1;
HICON g_hNotifyIcon = NULL;
static HICON static HICON
CreateTrayIcon(LPTSTR szLCID) CreateTrayIcon(LPTSTR szLCID)
@ -98,55 +99,50 @@ CreateTrayIcon(LPTSTR szLCID)
static VOID static VOID
AddTrayIcon(HWND hwnd) AddTrayIcon(HWND hwnd)
{ {
NOTIFYICONDATA tnid; NOTIFYICONDATA tnid = { sizeof(tnid), hwnd, 1, NIF_ICON | NIF_MESSAGE | NIF_TIP };
TCHAR szLCID[CCH_LAYOUT_ID + 1]; TCHAR szLCID[CCH_LAYOUT_ID + 1];
TCHAR szName[MAX_PATH]; TCHAR szName[MAX_PATH];
GetLayoutID(_T("1"), szLCID, ARRAYSIZE(szLCID)); GetLayoutID(_T("1"), szLCID, ARRAYSIZE(szLCID));
GetLayoutName(_T("1"), szName, ARRAYSIZE(szName)); GetLayoutName(_T("1"), szName, ARRAYSIZE(szName));
memset(&tnid, 0, sizeof(tnid));
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = 1;
tnid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
tnid.uCallbackMessage = WM_NOTIFYICONMSG; tnid.uCallbackMessage = WM_NOTIFYICONMSG;
tnid.hIcon = CreateTrayIcon(szLCID); tnid.hIcon = CreateTrayIcon(szLCID);
StringCchCopy(tnid.szTip, ARRAYSIZE(tnid.szTip), szName); StringCchCopy(tnid.szTip, ARRAYSIZE(tnid.szTip), szName);
Shell_NotifyIcon(NIM_ADD, &tnid); Shell_NotifyIcon(NIM_ADD, &tnid);
if (g_hNotifyIcon)
DestroyIcon(g_hNotifyIcon);
g_hNotifyIcon = tnid.hIcon;
} }
static VOID static VOID
DelTrayIcon(HWND hwnd) DeleteTrayIcon(HWND hwnd)
{ {
NOTIFYICONDATA tnid; NOTIFYICONDATA tnid = { sizeof(tnid), hwnd, 1 };
memset(&tnid, 0, sizeof(tnid));
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = 1;
Shell_NotifyIcon(NIM_DELETE, &tnid); Shell_NotifyIcon(NIM_DELETE, &tnid);
if (g_hNotifyIcon)
{
DestroyIcon(g_hNotifyIcon);
g_hNotifyIcon = NULL;
}
} }
static VOID static VOID
UpdateTrayIcon(HWND hwnd, LPTSTR szLCID, LPTSTR szName) UpdateTrayIcon(HWND hwnd, LPTSTR szLCID, LPTSTR szName)
{ {
NOTIFYICONDATA tnid; NOTIFYICONDATA tnid = { sizeof(tnid), hwnd, 1, NIF_ICON | NIF_MESSAGE | NIF_TIP };
memset(&tnid, 0, sizeof(tnid));
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = 1;
tnid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
tnid.uCallbackMessage = WM_NOTIFYICONMSG; tnid.uCallbackMessage = WM_NOTIFYICONMSG;
tnid.hIcon = CreateTrayIcon(szLCID); tnid.hIcon = CreateTrayIcon(szLCID);
StringCchCopy(tnid.szTip, ARRAYSIZE(tnid.szTip), szName); StringCchCopy(tnid.szTip, ARRAYSIZE(tnid.szTip), szName);
Shell_NotifyIcon(NIM_MODIFY, &tnid); Shell_NotifyIcon(NIM_MODIFY, &tnid);
if (g_hNotifyIcon)
DestroyIcon(g_hNotifyIcon);
g_hNotifyIcon = tnid.hIcon;
} }
static BOOL static BOOL
@ -560,7 +556,7 @@ WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
DoUnregisterAltShiftHotKeys(hwnd); DoUnregisterAltShiftHotKeys(hwnd);
DeleteHooks(); DeleteHooks();
DestroyMenu(s_hMenu); DestroyMenu(s_hMenu);
DelTrayIcon(hwnd); DeleteTrayIcon(hwnd);
PostQuitMessage(0); PostQuitMessage(0);
break; break;
} }