C / C++
WIN32 API - Set visibility mode for windows
You can use something like this:
NOTIFYICONDATA nid = {0};
#define WM_TRAY_DOUBLE_CLICK WM_USER + 1
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
nid.cbSize = NOTIFYICONDATAW_V3_SIZE;
nid.hWnd = hWnd;
nid.uFlags = NIF_ICON | NIF_INFO | NIF_MESSAGE;
nid.uCallbackMessage = WM_TRAY_DOUBLE_CLICK;
wcscpy_s(nid.szInfo, 256, L"Info");
wcscpy_s(nid.szInfoTitle, 64, L"Title");
nid.dwInfoFlags = NIIF_INFO;
nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
return 0;
case WM_SYSCOMMAND:
switch (wParam)
{
case SC_MINIMIZE:
ShowWindow(hWnd, SW_HIDE);
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | ~WS_EX_APPWINDOW);
ShowWindow(hWnd, SW_SHOW);
Shell_NotifyIcon(NIM_ADD, &nid);
break;
}
break;
case WM_TRAY_DOUBLE_CLICK:
switch (lParam)
{
case WM_LBUTTONDBLCLK:
ShowWindow(hWnd, SW_HIDE);
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_APPWINDOW);
ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd);
Shell_NotifyIcon(NIM_DELETE, &nid);
break;
}
return 0;
case WM_DESTROY:
Shell_NotifyIcon(NIM_DELETE, &nid);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
SW_SHOW and SW_HIDE work as they should.
I figured there was a mistake I made when handling WM_SYSCOMMAND message,
case WM_SYSCOMMAND:
if (wParam == SC_MINIMIZE){
MinimizeToSysTray(); //calls the function which adds the icon to system tray, and hides the window
return 0;
}
//return 0 if the message was handled, else pass it to DefWindowProc(). I was using a 'break' instead of 'return' in either cases which then calls DefWindowProc() at the end.