1. 程式人生 > >win32建立應用程式的系統托盤圖示

win32建立應用程式的系統托盤圖示

    前段時間工作需要,做了一個應用程式並且是要帶有系統托盤圖示的,雖然網上還是有很多的相關程式碼介紹,但是這裡還是想寫一下,做一個記錄吧,簡單介紹下過程以及API的呼叫步驟。

    我寫的這個是基於一個模態對話方塊的:開始呢定義出我們要用的變數

    NOTIFYICONDATA nid;
    UINT WM_TASKBARCREATED = 0;

    1、首先在WM_INITDIALOG訊息中創建出我們的系統托盤圖示的反鍵選單(如果你需要)

    if (pNid == NULL)
    {
        return;
    }
    pNid->cbSize = sizeof(NOTIFYICONDATA);
    pNid->hWnd = hWnd;
    pNid->uID = 0;
    pNid->uFlags = NIF_ICON | NIF_MESSAGE | NIF_INFO | NIF_TIP;
    pNid->uCallbackMessage = WM_USER;
    pNid->hIcon = LoadIcon(NULL, IDI_APPLICATION);

    wcscpy(pNid->szInfo, _T("Synchronous Time"));
    wcscpy(pNid->szTip, _T("Synchronous Time"));
    wcscpy(pNid->szInfoTitle,_T(""));

    Shell_NotifyIcon(NIM_ADD, pNid);
    hmenu=CreatePopupMenu();

    AppendMenu(hmenu, MF_STRING,IDR_SHOW, _T("Show"));
    AppendMenu(hmenu, MF_STRING,IDR_EXIT, _T("Exit"));

    SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) | WS_EX_TOOLWINDOW);

    2、處理default訊息分支

    default:
        if (uMsg == WM_TASKBARCREATED)
            SendMessage(hWnd, WM_CREATE, wParam, lParam);
        break;

    3、此時呢在產生的WM_USER訊息中我們可以加上對托盤圖示反鍵選單的滑鼠點選處理

    if (lParam == WM_LBUTTONDOWN);//左鍵單擊不作任何處理
            if (lParam == WM_LBUTTONDBLCLK)
            {
                PostMessage(hWnd, WM_MYSHOWWINDOW, wParam, lParam);//左鍵雙擊的處理
            }
            if (lParam == WM_RBUTTONDOWN)
            {
                ProShellIconMsg(hWnd, wParam, lParam, &nid);//右鍵單擊的處理
            }
            break;

    4、左鍵雙擊的處理:
        case WM_MYSHOWWINDOW:
        ShowWindow(hWnd, SW_SHOW);
        UpdateWindow(hWnd);
        break;

    5、右鍵單擊的處理:

    POINT pt;
    int xx;
    GetCursorPos(&pt);
    SetForegroundWindow(hWnd);
    xx = TrackPopupMenu(hmenu, TPM_RETURNCMD, pt.x, pt.y, NULL, hWnd, NULL);
    if (xx == IDR_SHOW)
    {
        PostMessage(hWnd, WM_MYSHOWWINDOW, wParam, lParam);
    }
    if (xx == IDR_EXIT)
    {
        Shell_NotifyIcon(NIM_DELETE, pNid);
    }

    6、此時呢在當我們點選對話方塊右上角的關閉按鈕時ShowWindow(hWnd, SW_HIDE);隱藏我們的主視窗。