代码之家  ›  专栏  ›  技术社区  ›  Jose

通知图标单击Win32 Api in c++

  •  1
  • Jose  · 技术社区  · 8 年前

    我有一段代码可以在任务栏中设置一个图标,但当有人右键/左键单击它时,我就不能了。有办法做到吗?

    //Notification
        NOTIFYICONDATA nid = {};
        nid.hWnd = hwnd;
        nid.cbSize = sizeof(nid);
        nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID;
    
        // Note: This is an example GUID only and should not be used.
        // Normally, you should use a GUID-generating tool to provide the value to
        // assign to guidItem.
        HICON hIcon = static_cast<HICON>(LoadImage(NULL,
            TEXT("gui\\sample.ico"),
            IMAGE_ICON,
            0, 0,
            LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE | LR_LOADFROMFILE));
        static const GUID myGUID =
        { 0x23977b55, 0x10e0, 0x4041,{ 0xb8, 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x68 } };
        nid.guidItem = myGUID;
        nid.hIcon = hIcon;
        // This text will be shown as the icon's tooltip.
        StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), title);
        SendMessage(nid.hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
        SendMessage(nid.hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
    //TaskBar
            // Show the notification.
            Shell_NotifyIcon(NIM_ADD, &nid) ? S_OK : E_FAIL;
    

    有人能帮我吗?谢谢

    1 回复  |  直到 8 年前
        1
  •  6
  •   Remy Lebeau    8 年前

    MSDN文档中涵盖了您的要求 Shell_NotifyIcon() :

    NOTIFYICONDATA structure

    NIF_消息(0x00000001)
    这个 uCallbackMessage 成员有效

    uCallback消息
    类型:UINT

    应用程序定义的消息标识符。系统使用此标识符向中标识的窗口发送通知消息 hWnd 。这些通知消息在以下情况下发送: 鼠标事件或鼠标悬停发生在图标的边框中 当使用键盘选择或激活图标时,或者当气球通知中发生这些操作时。

    uVersion 成员为0或NOTIFYICON_VERSION,则 wParam lParam 参数保存与事件关联的鼠标或键盘消息。例如,当指针移动到任务栏图标上时, l参数 设置为WM_MOUSEMOVE。

    uCallback消息 成员,但对 l参数 w参数 该消息的参数更改如下:

    • LOWORD(lParam) 包含通知事件,例如NIN_BALLONSHOW、NIN_POPUPOPEN或WM_CONTEXTMENU。

    • HIWORD(lParam) 包含图标ID。图标ID的长度限制为16位。

    • GET_X_LPARAM(wParam) w参数 设置为目标图标的左上角。对于所有其他消息, w参数 未定义。

    • GET_Y_LPARAM(wParam) 返回为X锚点定义的通知事件和消息的Y锚点坐标。

    添加通知图标时,您需要:

    1. 指定一个 hWnd(小时/分钟)

    2. 指定一个 nID guidItem 以识别图标。如果您使用 guidItem(guidItem) 并显示多个图标,通知将无法告诉您哪个图标正在通知您,因此您必须为每个图标使用单独的HWND。而且 guidItem(guidItem) 实际上在功能上比 ,导致的问题比解决的问题多,所以我强烈建议远离 guidItem(guidItem) 全部并始终使用 国家识别码 只有

    3. 启用 NIF_MESSAGE 标记,并提供自定义 uCallback消息 消息ID。

    当用户与图标交互时,HWND的窗口程序将接收消息ID。消息是 WPARAM LPARAM 值将描述操作。

    例如:

    #define APPWM_ICONNOTIFY (WM_APP + 1)
    
    ...
    
    HICON hIcon = static_cast<HICON>(LoadImage(NULL,
        TEXT("gui\\sample.ico"),
        IMAGE_ICON,
        0, 0,
        LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE | LR_LOADFROMFILE));
    
    SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
    SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
    
    //Notification
    NOTIFYICONDATA nid = {};
    nid.cbSize = sizeof(nid);
    nid.hWnd = hwnd;
    nid.uID = 1;
    nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
    nid.uCallbackMessage = APPWM_ICONNOTIFY;
    nid.hIcon = hIcon;
    // This text will be shown as the icon's tooltip.
    StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), title);
    
    // Show the notification.
    Shell_NotifyIcon(NIM_ADD, &nid);
    
    ...
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch (uMsg)
        {
            case APPWM_ICONNOTIFY:
            {
                switch (lParam)
                {
                    case WM_LBUTTONUP:
                        //...
                        break;
                    case WM_RBUTTONUP:
                        //...
                        break;
                }
    
                return 0;
            }
    
            //...
        }
    
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }