Kasumi20
V2EX  ›  Windows

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

  •  
  •   Kasumi20 · Feb 26, 2021 · 3289 views
    This topic created in 1912 days ago, the information mentioned may be changed or developed.

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

    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);
    
    Supplement 2  ·  Jan 20, 2022
    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));
    }
    Supplement 3  ·  Jan 20, 2022
    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 replies    2021-03-01 12:25:15 +08:00
    USAA
        1
    USAA  
       Feb 26, 2021   ❤️ 1
    ShowBalloonTip
    Kasumi20
        2
    Kasumi20  
    OP
       Feb 26, 2021
    @USAA 想知道 C#底层怎么实现的,肯定还是调用 Shell_NotifyIconW
    lujjjh
        4
    lujjjh  
       Feb 26, 2021
    Shell_NotifyIconW(NIM_ADD, &nid);
    Shell_NotifyIconW(NIM_DELETE, &nid);

    加完就删。

    但是在 Win7 上估计会比较奇怪,以前的样式是有个箭头指向通知区域图标的。
    Kasumi20
        5
    Kasumi20  
    OP
       Feb 26, 2021
    @lujjjh 删除或者修改 szInfo 为空串都会让提示立即消失的
    lujjjh
        6
    lujjjh  
       Feb 26, 2021
    @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
       Feb 26, 2021
    @ho121 谢谢,我好像明白了
    Tumblr
        9
    Tumblr  
       Mar 1, 2021
    PowerShell 有个 module 叫 BurntToast,可以借鉴。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2840 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 04:33 · PVG 12:33 · LAX 21:33 · JFK 00:33
    ♥ Do have faith in what you're doing.