NOTIFY ICON在c ++中单击Win32 Api

时间:2016-08-06 16:49:35

标签: c++ api winapi click notifyicon

我已经在任务栏中设置了一个图标代码,但是当有人右键/左键点击它时我无法做到。有没有办法做到这一点?

//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 个答案:

答案 0 :(得分:5)

MSDN的Shell_NotifyIcon()文档

中介绍了您要求的内容

NOTIFYICONDATA structure

  

NIF_MESSAGE(0x00000001)
  uCallbackMessage成员有效

  

<强> uCallbackMessage
  输入:UINT

     

应用程序定义的消息标识符。系统使用此标识符将通知消息发送到hWnd中标识的窗口。当鼠标事件或悬停发生在图标的边界矩形中,使用键盘选择或激活图标时,或者在气球通知中发生这些操作时,会发送这些通知消息。

     

uVersion成员为0或NOTIFYICON_VERSION时,消息的wParam参数包含发生事件的任务栏图标的标识符。该标识符的长度可以是32位。 lParam参数保存与事件关联的鼠标或键盘消息。例如,当指针移过任务栏图标时,lParam设置为WM_MOUSEMOVE。

     

uVersion成员为NOTIFYICON_VERSION_4时,应用程序继续通过uCallbackMessage成员以应用程序定义的消息的形式接收通知事件,但lParam和{{的解释1}}该消息的参数更改如下:

     
      
  • wParam包含通知事件,例如NIN_BALLOONSHOW,NIN_POPUPOPEN或WM_CONTEXTMENU。

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

  •   
  • HIWORD(lParam)返回通知事件NIN_POPUPOPEN,NIN_SELECT,NIN_KEYSELECT以及WM_MOUSEFIRST和WM_MOUSELAST之间的所有鼠标消息的X锚点坐标。如果键盘生成了任何这些消息,则GET_X_LPARAM(wParam)将设置为目标图标的左上角。对于所有其他消息,wParam未定义。

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

  •   

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

  1. 指定将从图标接收通知的GET_Y_LPARAM(wParam)

  2. 指定hWndnID以识别图标。如果您使用guidItem并显示多个图标,则通知将无法告诉您哪个图标正在通知您,因此您必须为每个图标使用单独的HWND。此外,guidItem实际上在功能上比guidItem更具限制性,并且导致的问题多于它解决的问题,所以我强烈建议完全远离nID并始终仅使用guidItem

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

  4. 每当用户与图标交互时,HWND的窗口过程将接收消息ID。消息的uCallbackMessageWPARAM值将描述操作。

    例如:

    LPARAM