2016-01-13 16 views
8

Tôi có ứng dụng máy tính để bàn WPF đang đẩy một số thông báo bằng cách sử dụng:cách hiển thị Mẹo bóng như Mẹo bóng của Windows 10 mà không kéo dài biểu tượng

NotifyIcon.ShowBalloonTip(,,,ToolTipIcon.None).

Vấn đề là:

Windows 10 sử dụng mới "Windows 10 hình chữ nhật với hình ảnh và văn bản" phong cách cho các thông báo Balloon (Tôi không biết làm thế nào chính xác nó được gọi là).

Nếu tham số I use ToolTipIcon.None, biểu tượng ứng dụng của tôi được đặt thành thuộc tính NotifyIcon.Icon và hiển thị nó trong thông báo Balloon này. Và biểu tượng này bị mờ/kéo dài (như biểu tượng quá nhỏ đã được chụp và kéo dài đến kích thước cần thiết cho hình ảnh ballon này).

Tệp ico của tôi chứa nhiều kích thước: 16*16, 32*32, 128*128, 256*256 v.v. Tôi đã cố gắng đặt tệp biểu tượng chỉ với một kích thước 128*128 nhưng không hoạt động.

Nó có hoạt động không?

Cảm ơn bạn.

+0

bạn biết có thể điều này là không thể – tofutim

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ee330740(v=vs.85).aspx # install_icon hiển thị biểu tượng tùy chỉnh đẹp để có thể – tofutim

+0

Để tham khảo về sự cố - hãy xem http://stackoverflow.com/questions/35242400/windows-10-notifyicon-icon-always-looks-very-pixilated – tofutim

Trả lời

2

Lớp sau sẽ hiển thị biểu tượng lớn, mượt mà trong đầu bóng trên Windows 10. Không có nghĩa là được đánh bóng, nhưng nó phải chứng minh khái niệm. Một phần tốt của mã được sao chép trực tiếp từ lớp Microsoft NotifyIcon đã biên dịch.

Những thay đổi quan trọng giữa các lớp NotifyIcon gốc và điều này là:

  1. Việc bổ sung (và sử dụng) của NOTIFYICONDATA.hBalloonIcon thành viên.
  2. Cài đặt của nOTIFYICONDATA.dwInfoFlags = NIIF_LARGE_ICON | NIIF_USER, thay vì NIIF_NONE.

Bạn có thể đọc chi tiết cụ thể về cấu trúc NOTIFYICONDATA here, nhưng ý chính là:

  • hBalloonIcon đã được bổ sung trong Vista, cụ thể để sử dụng bên ngoài của khay hệ thống.
  • NIIF_USER nói để sử dụng biểu tượng ở hBalloonIcon làm biểu tượng quả bóng.
  • NIIF_LARGE_ICON cho biết biểu tượng của quả bóng phải lớn.

NotifyIconLarge lớp:

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace BalloonNotification 
{ 
    public class NotifyIconLarge : IDisposable 
    { 
     [DllImport("shell32.dll", CharSet = CharSet.Auto)] 
     public static extern int Shell_NotifyIcon(int message, NOTIFYICONDATA pnid); 

     [DllImport("Comctl32.dll", CharSet = CharSet.Unicode)] 
     private static extern IntPtr LoadIconWithScaleDown(IntPtr hinst, string pszName, int cx, int cy, out IntPtr phico); 

     [DllImport("user32.dll", SetLastError = true)] 
     static extern bool DestroyIcon(IntPtr hIcon); 

     private const int NIIF_LARGE_ICON = 0x00000020; 
     private const int NIIF_USER = 0x00000004; 

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     public class NOTIFYICONDATA 
     { 
      public int cbSize = Marshal.SizeOf(typeof(NOTIFYICONDATA)); 
      public IntPtr hWnd; 
      public int uID; 
      public int uFlags; 
      public int uCallbackMessage; 
      public IntPtr hIcon; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
      public string szTip; 
      public int dwState; 
      public int dwStateMask; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] 
      public string szInfo; 
      public int uTimeoutOrVersion; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] 
      public string szInfoTitle; 
      public int dwInfoFlags; 
      Guid guidItem; 
      public IntPtr hBalloonIcon; 
     } 

     private IntPtr _windowHandle; 
     private IntPtr _hIcon; 
     private bool _added; 
     private int _id = 1; 
     private string _tipText; 

     public NotifyIconLarge(IntPtr windowHandle, string iconFile, int iconSize, string tipText) 
     { 
      _windowHandle = windowHandle; 
      _tipText = tipText; 
      IntPtr result = LoadIconWithScaleDown(IntPtr.Zero, iconFile, iconSize, iconSize, out _hIcon); 
      UpdateIcon(true); 
     } 

     private void UpdateIcon(bool showIconInTray) 
     { 
      NOTIFYICONDATA nOTIFYICONDATA = new NOTIFYICONDATA(); 
      nOTIFYICONDATA.uCallbackMessage = 2048; 
      nOTIFYICONDATA.uFlags = 1; 
      nOTIFYICONDATA.hWnd = _windowHandle; 
      nOTIFYICONDATA.uID = _id; 
      nOTIFYICONDATA.hIcon = IntPtr.Zero; 
      nOTIFYICONDATA.szTip = null; 
      if (_hIcon != IntPtr.Zero) 
      { 
       nOTIFYICONDATA.uFlags |= 2; 
       nOTIFYICONDATA.hIcon = _hIcon; 
      } 
      nOTIFYICONDATA.uFlags |= 4; 
      nOTIFYICONDATA.szTip = _tipText; 
      nOTIFYICONDATA.hBalloonIcon = _hIcon; 
      if (showIconInTray && _hIcon != IntPtr.Zero) 
      { 
       if (!_added) 
       { 
        Shell_NotifyIcon(0, nOTIFYICONDATA); 
        _added = true; 
       } 
       else 
       { 
        Shell_NotifyIcon(1, nOTIFYICONDATA); 
       } 
      } 
      else 
      { 
       if (_added) 
       { 
        Shell_NotifyIcon(2, nOTIFYICONDATA); 
        _added = false; 
       } 
      } 
     } 

     public void ShowBalloonTip(int timeout, string tipTitle, string tipText, ToolTipIcon tipIcon) 
     { 
      NOTIFYICONDATA nOTIFYICONDATA = new NOTIFYICONDATA(); 
      nOTIFYICONDATA.hWnd = _windowHandle; 
      nOTIFYICONDATA.uID = _id; 
      nOTIFYICONDATA.uFlags = 16; 
      nOTIFYICONDATA.uTimeoutOrVersion = timeout; 
      nOTIFYICONDATA.szInfoTitle = tipTitle; 
      nOTIFYICONDATA.szInfo = tipText; 
      switch (tipIcon) 
      { 
       case ToolTipIcon.None: 
        nOTIFYICONDATA.dwInfoFlags = NIIF_LARGE_ICON | NIIF_USER; 
        break; 
       case ToolTipIcon.Info: 
        nOTIFYICONDATA.dwInfoFlags = 1; 
        break; 
       case ToolTipIcon.Warning: 
        nOTIFYICONDATA.dwInfoFlags = 2; 
        break; 
       case ToolTipIcon.Error: 
        nOTIFYICONDATA.dwInfoFlags = 3; 
        break; 
      } 
      int ret = Shell_NotifyIcon(1, nOTIFYICONDATA); 
     } 

     public void RemoveFromTray() 
     { 
      UpdateIcon(false); 
      if (_hIcon != IntPtr.Zero) 
       DestroyIcon(_hIcon); 
     } 

     ~NotifyIconLarge() 
     { 
      Dispose(false); 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 

     public void Dispose(bool disposing) 
     { 
      RemoveFromTray(); 
     } 
    } 
} 

Khai báo nó ở đâu đó:

private NotifyIconLarge _nil; 

Sau đó sử dụng nó như thế này:

string fileName = @"C:\path_to_some_icon.ico"; 
_nil = new NotifyIconLarge(Handle, fileName, 64, "Icon Tip"); 
_nil.ShowBalloonTip(10000, "Balloon Title", "Balloon Text", ToolTipIcon.None); 

Khi hoàn tất, loại bỏ các biểu tượng trên khay:

_nil.RemoveFromTray(); 
+0

Ngọt ngào - chỉ cần đọc về cách tiếp cận này - sẽ kiểm tra nó. – tofutim

Các vấn đề liên quan