V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Kasumi20
V2EX  ›  Windows

如何发送一个没有通知图标的气泡通知?

  •  
  •   Kasumi20 · 2021-02-26 16:27:06 +08:00 · 2600 次点击
    这是一个创建于 1351 天前的主题,其中的信息可能已经有所发展或是发生改变。

    怎么搞这都有一个黑色的图标,难受

    yzd10K.png

    代码:

    NOTIFYICONDATAW nid = {};
    nid.cbSize = sizeof nid;
    nid.hWnd = hwnd;
    nid.uID = IDNI_BALLOON;
    nid.uFlags = NIF_INFO | NIF_MESSAGE;
    nid.dwInfoFlags = NIIF_INFO;
    lstrcpy(nid.szInfoTitle, L"气泡通知");
    lstrcpy(nid.szInfo, L"这是一条气泡通知");
    nid.uCallbackMessage = WM_USER;
    
    Shell_NotifyIconW(NIM_ADD, &nid);
    
    第 2 条附言  ·  2022-01-20 14:56:01 +08:00
    void balloon_notification() {
    NOTIFYICONDATAW nid = {0};
    nid.cbSize = sizeof nid;
    nid.hWnd = hwnd;

    nid.uFlags |= NIF_ICON;
    nid.hIcon = LoadIconA(NULL, IDI_SHIELD);

    nid.uFlags |= NIF_MESSAGE;
    nid.uCallbackMessage = WM_USER + 1;

    nid.uFlags |= NIF_INFO;
    nid.dwInfoFlags = NIIF_ICON_MASK; // 这个图标比较特殊,必须要设置 hIcon 才能使用
    lstrcpyW(nid.szInfoTitle, L"气球通知");
    lstrcpyW(nid.szInfo, L"这是一条气球通知");
    SYSCALL(Shell_NotifyIconW(NIM_ADD, &nid));

    // 隐藏图标
    nid.uFlags |= NIF_STATE;
    nid.dwState = NIS_HIDDEN;
    // nid.dwStateMask = NIS_HIDDEN; // 隐藏进程名
    SYSCALL(Shell_NotifyIconW(NIM_MODIFY, &nid));
    }
    第 3 条附言  ·  2022-01-20 14:56:25 +08:00
    void balloon_notification() {
        NOTIFYICONDATAW nid = {0};
        nid.cbSize = sizeof nid;
        nid.hWnd = hwnd;
    
        nid.uFlags |= NIF_ICON;
        nid.hIcon = LoadIconA(NULL, IDI_SHIELD);
    
        nid.uFlags |= NIF_MESSAGE;
        nid.uCallbackMessage = WM_USER + 1;
    
        nid.uFlags |= NIF_INFO;
        nid.dwInfoFlags = NIIF_ICON_MASK; // 这个图标比较特殊,必须要设置hIcon才能使用
        lstrcpyW(nid.szInfoTitle, L"气球通知");
        lstrcpyW(nid.szInfo, L"这是一条气球通知");
        SYSCALL(Shell_NotifyIconW(NIM_ADD, &nid));
    
        // 隐藏图标
        nid.uFlags |= NIF_STATE;
        nid.dwState = NIS_HIDDEN;
        // nid.dwStateMask = NIS_HIDDEN; // 隐藏进程名
        SYSCALL(Shell_NotifyIconW(NIM_MODIFY, &nid));
    }
    
    9 条回复    2021-03-01 12:25:15 +08:00
    USAA
        1
    USAA  
       2021-02-26 16:46:12 +08:00   ❤️ 1
    ShowBalloonTip
    Kasumi20
        2
    Kasumi20  
    OP
       2021-02-26 17:10:27 +08:00
    @USAA 想知道 C#底层怎么实现的,肯定还是调用 Shell_NotifyIconW
    lujjjh
        4
    lujjjh  
       2021-02-26 20:53:31 +08:00
    Shell_NotifyIconW(NIM_ADD, &nid);
    Shell_NotifyIconW(NIM_DELETE, &nid);

    加完就删。

    但是在 Win7 上估计会比较奇怪,以前的样式是有个箭头指向通知区域图标的。
    Kasumi20
        5
    Kasumi20  
    OP
       2021-02-26 20:57:51 +08:00
    @lujjjh 删除或者修改 szInfo 为空串都会让提示立即消失的
    lujjjh
        6
    lujjjh  
       2021-02-26 21:22:03 +08:00
    @Kasumi20 我测试下来没有复现。如果考虑抛弃 Win7- 的话,可以用 UWP 的 API,也具备更多的能力

    https://docs.microsoft.com/en-us/windows/uwp/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl

    不过对 C++ 不太友好,需要自己注册 COM server
    Kasumi20
        8
    Kasumi20  
    OP
       2021-02-26 22:29:40 +08:00
    @ho121 谢谢,我好像明白了
    Tumblr
        9
    Tumblr  
       2021-03-01 12:25:15 +08:00
    PowerShell 有个 module 叫 BurntToast,可以借鉴。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3359 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:39 · PVG 18:39 · LAX 02:39 · JFK 05:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.