Added hotkey for hide tray icon.
This commit is contained in:
@@ -17,14 +17,16 @@ HMENU hMenu, hPopup;
|
|||||||
HWND hWnd;
|
HWND hWnd;
|
||||||
NOTIFYICONDATA nid = { 0 };
|
NOTIFYICONDATA nid = { 0 };
|
||||||
KBDLLHOOKSTRUCT *pkhs;
|
KBDLLHOOKSTRUCT *pkhs;
|
||||||
|
BOOL pressed = FALSE, showIcon = TRUE;
|
||||||
|
BOOL bLCTRL = FALSE, bLWIN = FALSE, bKEYI = FALSE, bKEYC = FALSE;
|
||||||
int dtCenterX, dtCenterY;
|
int dtCenterX, dtCenterY;
|
||||||
bool pressed = FALSE;
|
|
||||||
|
|
||||||
// Прототипы функций
|
// Прототипы функций
|
||||||
ATOM MyRegisterClass(HINSTANCE);
|
ATOM MyRegisterClass(HINSTANCE);
|
||||||
VOID ShowError(HINSTANCE, UINT);
|
VOID ShowError(HINSTANCE, UINT);
|
||||||
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);
|
||||||
|
BOOL CreateTrayIcon();
|
||||||
|
|
||||||
// Точка входа
|
// Точка входа
|
||||||
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
|
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
|
||||||
@@ -43,6 +45,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
MyRegisterClass(hInstance);
|
MyRegisterClass(hInstance);
|
||||||
|
|
||||||
hWnd = CreateWindowExW(0, szClass, szTitle, 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);
|
hWnd = CreateWindowExW(0, szClass, szTitle, 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);
|
||||||
if (!hWnd)
|
if (!hWnd)
|
||||||
{
|
{
|
||||||
@@ -50,20 +53,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nid.cbSize = sizeof(NOTIFYICONDATA);
|
if (showIcon)
|
||||||
nid.hWnd = hWnd;
|
{
|
||||||
nid.uVersion = NOTIFYICON_VERSION;
|
if (!CreateTrayIcon())
|
||||||
nid.uCallbackMessage = WM_WCW;
|
|
||||||
nid.hIcon = hIcon;
|
|
||||||
nid.uID = IDI_TRAYICON;
|
|
||||||
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
|
||||||
nid.dwInfoFlags = NIIF_INFO;
|
|
||||||
StringCchCopy(nid.szTip, sizeof(nid.szTip), szTitle);
|
|
||||||
if (!Shell_NotifyIcon(NIM_ADD, &nid))
|
|
||||||
{
|
{
|
||||||
ShowError(hInstance, IDS_ERR_ICON);
|
ShowError(hInstance, IDS_ERR_ICON);
|
||||||
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
|
SendMessage(hWnd, WM_CLOSE, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU));
|
hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU));
|
||||||
if (!hMenu)
|
if (!hMenu)
|
||||||
@@ -160,11 +157,38 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
pkhs = (KBDLLHOOKSTRUCT*)lParam;
|
pkhs = (KBDLLHOOKSTRUCT*)lParam;
|
||||||
bool bLCTRL, bLWIN;
|
|
||||||
GetAsyncKeyState(VK_LCONTROL) < 0 ? bLCTRL = TRUE : bLCTRL = FALSE;
|
|
||||||
GetAsyncKeyState(VK_LWIN) < 0 ? bLWIN = TRUE : bLWIN = FALSE;
|
|
||||||
|
|
||||||
if ((bLCTRL && bLWIN && pkhs->vkCode == 0x43) && !pressed)
|
if (wParam == WM_KEYUP)
|
||||||
|
{
|
||||||
|
if (pkhs->vkCode == VK_LCONTROL) bLCTRL = FALSE;
|
||||||
|
if (pkhs->vkCode == VK_LWIN) bLWIN = FALSE;
|
||||||
|
pressed = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wParam == WM_KEYDOWN)
|
||||||
|
{
|
||||||
|
if (pkhs->vkCode == VK_LCONTROL) bLCTRL = TRUE;
|
||||||
|
if (pkhs->vkCode == VK_LWIN) bLWIN = TRUE;
|
||||||
|
|
||||||
|
if (bLCTRL && bLWIN && pkhs->vkCode == 0x49 && !pressed) // 'I' key
|
||||||
|
{
|
||||||
|
pressed = TRUE;
|
||||||
|
showIcon = !showIcon;
|
||||||
|
if (showIcon)
|
||||||
|
{
|
||||||
|
if (!CreateTrayIcon())
|
||||||
|
{
|
||||||
|
ShowError(GetModuleHandle(NULL), IDS_ERR_ICON);
|
||||||
|
showIcon = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Shell_NotifyIcon(NIM_DELETE, &nid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bLCTRL && bLWIN && pkhs->vkCode == 0x43 && !pressed) // 'C' key
|
||||||
{
|
{
|
||||||
pressed = TRUE;
|
pressed = TRUE;
|
||||||
HWND fgWindow = GetForegroundWindow();
|
HWND fgWindow = GetForegroundWindow();
|
||||||
@@ -177,7 +201,6 @@ LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
|
|||||||
if (parentWindow) fgWindow = parentWindow;
|
if (parentWindow) fgWindow = parentWindow;
|
||||||
else break;
|
else break;
|
||||||
}
|
}
|
||||||
|
|
||||||
WINDOWPLACEMENT wp = { 0 };
|
WINDOWPLACEMENT wp = { 0 };
|
||||||
wp.length = sizeof(WINDOWPLACEMENT);
|
wp.length = sizeof(WINDOWPLACEMENT);
|
||||||
GetWindowPlacement(fgWindow, &wp);
|
GetWindowPlacement(fgWindow, &wp);
|
||||||
@@ -196,14 +219,29 @@ LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
|
|||||||
SendMessage(fgWindow, WM_EXITSIZEMOVE, NULL, NULL);
|
SendMessage(fgWindow, WM_EXITSIZEMOVE, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pressed = FALSE;
|
}
|
||||||
}
|
}
|
||||||
return CallNextHookEx(NULL, nCode, wParam, lParam);
|
return CallNextHookEx(NULL, nCode, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL CreateTrayIcon()
|
||||||
|
{
|
||||||
|
nid.cbSize = sizeof(NOTIFYICONDATA);
|
||||||
|
nid.hWnd = hWnd;
|
||||||
|
nid.uVersion = NOTIFYICON_VERSION;
|
||||||
|
nid.uCallbackMessage = WM_WCW;
|
||||||
|
nid.hIcon = hIcon;
|
||||||
|
nid.uID = IDI_TRAYICON;
|
||||||
|
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
||||||
|
nid.dwInfoFlags = NIIF_INFO;
|
||||||
|
StringCchCopy(nid.szTip, sizeof(nid.szTip), szTitle);
|
||||||
|
return Shell_NotifyIcon(NIM_ADD, &nid);
|
||||||
|
}
|
||||||
|
|
||||||
VOID ShowError(HINSTANCE hInstance, UINT uID)
|
VOID ShowError(HINSTANCE hInstance, UINT uID)
|
||||||
{
|
{
|
||||||
WCHAR szErrorText[MAX_LOADSTRING]; // Текст ошибки
|
WCHAR szErrorText[MAX_LOADSTRING]; // Текст ошибки
|
||||||
LoadStringW(hInstance, uID, szErrorText, MAX_LOADSTRING);
|
LoadStringW(hInstance, uID, szErrorText, MAX_LOADSTRING);
|
||||||
MessageBox(hWnd, szErrorText, szTitle, MB_OK | MB_ICONERROR);
|
MessageBox(hWnd, szErrorText, szTitle, MB_OK | MB_ICONERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user