【问题标题】:How to show images in Windows balloon notifications?如何在 Windows 气球通知中显示图像?
【发布时间】:2015-04-05 20:08:28
【问题描述】:

是否可以在 Windows 气球通知中显示自定义图像/图标? .net 框架中的NotifyIcon 控件支持气球通知,但它只允许默认图标,如信息、错误等。

如果 NotifyIcon 不支持这一点,是否有另一个 API .net 框架允许使用自定义图像进行通知?

【问题讨论】:

    标签: .net windows notifications balloon-tip


    【解决方案1】:

    找到了答案。 Windows API 支持自定义图标,但托管的 .net 界面非常简单。 Win32 api Shell_NotifyIcon 接受 NOTIFYICONDATA 结构。此结构具有设置自定义图标的字段。

        public enum NotifyFlags
        {
            NIF_MESSAGE = 0x01, NIF_ICON = 0x02, NIF_TIP = 0x04, NIF_INFO = 0x10, NIF_STATE = 0x08,
            NIF_GUID = 0x20, NIF_SHOWTIP = 0x80, NIF_REALTIME = 0x40,
        }
    
        public enum NotifyCommand { NIM_ADD = 0x0, NIM_DELETE = 0x2, NIM_MODIFY = 0x1, NIM_SETVERSION = 0x4 }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct NOTIFYICONDATA
        {
            public Int32 cbSize;
            public IntPtr hWnd;
            public Int32 uID;
            public NotifyFlags uFlags;
            public Int32 uCallbackMessage;
            public IntPtr hIcon;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public String szTip;
            public Int32 dwState;
            public Int32 dwStateMask;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public String szInfo;
            public Int32 uVersion;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
            public String szInfoTitle;
            public Int32 dwInfoFlags;
            public Guid guidItem; //> IE 6
            public IntPtr hBalloonIcon;
        }
    
        [DllImport("shell32.dll")]
        public static extern System.Int32 Shell_NotifyIcon(NotifyCommand cmd, ref NOTIFYICONDATA data);
    
        private void AddBalloon(string title, string message, Image image)
        {
            NOTIFYICONDATA data = new NOTIFYICONDATA();
    
            data.cbSize = Marshal.SizeOf(data);
            data.uID = 0x01;
            data.hWnd = Handle;
            data.dwInfoFlags = NIIF_USER;
            data.hIcon = Icon.Handle;
            data.hBalloonIcon = IntPtr.Zero;
            if (message.Image != null)
            {
                data.hBalloonIcon = ((Bitmap)image).GetHicon();
                data.dwInfoFlags |= NIIF_LARGE_ICON;
            }
            data.szInfo = message;
            data.szInfoTitle = title;
    
            data.uFlags = NotifyFlags.NIF_INFO | NotifyFlags.NIF_SHOWTIP | NotifyFlags.NIF_REALTIME;
    
            Shell_NotifyIcon(NotifyCommand.NIM_MODIFY, ref data) != 1);
        }
    

    【讨论】:

      【解决方案2】:

      未经测试,但您可以更改图标,希望这有帮助吗?

      notificationIcon.Icon =  new Icon(Properties.Resources.ResourceManager.GetStream("<Image Location From root>"));
      

      【讨论】:

      • 没有帮助 :( 这会设置任务栏中显示的图标 - 它不会影响气球通知图标。
      【解决方案3】:

      我使用了joyhrs的建议:

      notificationIcon.Icon =  new Icon(Properties.Resources.ResourceManager.GetStream("<Image Location From root>"));
      

      正如您所说,它不仅会在气球提示中显示新图标,还会更改系统托盘中的图标。所以一个简单的 hack 就是添加处理程序

      private void notifyIcon_BalloonTipShown(object sender, EventArgs e)
      

      并将系统托盘图标更改回原来的图标,使气球提示中的图标设置为新图标。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多