IT-info > C / C++ > Diverse

C / C++

WIN32 API - Set visibility mode for windows

SW_SHOW/SW_HIDE

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.