Как отображать изображения в всплывающих уведомлениях Windows?

Можно ли отображать пользовательское изображение/значок в всплывающем уведомлении Windows? Значок NotifyIcon элемент управления в .net framework поддерживает всплывающие уведомления, но позволяет использовать только значки по умолчанию, такие как информация, ошибка и т. д.

Если NotifyIcon не поддерживает это, существует ли другая платформа API .net, которая позволяет получать уведомления с пользовательскими изображениями?


person Gowtham    schedule 05.04.2015    source источник


Ответы (3)


Нашел ответ. 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);
    }
person Gowtham    schedule 05.10.2015

Не проверено, но вы можете изменить значок, надеюсь, это полезно?

notificationIcon.Icon =  new Icon(Properties.Resources.ResourceManager.GetStream("<Image Location From root>"));
person joyhrs    schedule 06.04.2015
comment
Бесполезно :( Это устанавливает значок, отображаемый на панели задач - он не влияет на значки всплывающих уведомлений. - person Gowtham; 06.04.2015

Я использовал предложение joyhrs:

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

и, как вы сказали, он не только показывает новый значок во всплывающей подсказке, но и меняет значок на панели задач. Таким образом, простой хак состоял в том, чтобы добавить обработчик

private void notifyIcon_BalloonTipShown(object sender, EventArgs e)

и измените значок на панели задач обратно на исходный, в результате чего значок в всплывающей подсказке останется новым значком.

person tonyk    schedule 19.08.2018