通知图标单击C ++中的Win32 Api

Jos*_*ose -2 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;
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?谢谢

Rem*_*eau 5

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

NOTIFYICONDATA结构

NIF_MESSAGE(00000001)
uCallbackMessage构件是有效的

uCallbackMessage
类型:UINT

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

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

uVersion成员为NOTIFYICON_VERSION_4时,应用程序将继续通过该uCallbackMessage成员以应用程序定义的消息的形式接收通知事件,但是对该消息的lParamwParam参数的解释如下:

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

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

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

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

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

  1. 指定一个hWnd将从图标接收通知的。

  2. 指定nIDguidItem来标识图标。如果使用guidItem并显示多个图标,则通知将无法告诉您哪个图标正在通知您,因此您必须为每个图标使用单独的HWND。另外,guidItem实际上在功能上比限制更严格nID,并且所引起的问题超出了解决的范围,因此,我强烈建议guidItem完全远离并始终使用nID

  3. 启用该NIF_MESSAGE标志,并提供自定义uCallbackMessage消息ID。

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

例如:

#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);
}
Run Code Online (Sandbox Code Playgroud)