2016-01-13 11 views
8

अधिक समय दिए बिना Windows 10 गुब्बारा टिप की तरह गुब्बारा टिप को दिखाने के लिए मैं WPF डेस्कटॉप अनुप्रयोग जो का उपयोग कर कुछ सूचनाएं धक्का है:कैसे आइकन

NotifyIcon.ShowBalloonTip(,,,ToolTipIcon.None)

समस्या है:

Windows 10 गुब्बारा सूचनाओं के लिए शैली (मैं नहीं जानता कि वास्तव में यह कैसे कहा जाता है) "छवि और पाठ के साथ विंडोज 10 आयत" नए प्रयोग करता है।

यदि मैं use ToolTipIcon.None पैरामीटर, तो यह मेरा एप्लिकेशन आइकन प्राप्त करता है जो NotifyIcon.Icon संपत्ति पर सेट किया गया था और इसे इस गुब्बारे अधिसूचना में दिखाता है। और यह आइकन धुंधला/फैला हुआ है (जैसे कि बहुत छोटा आइकन लिया गया था और इस बॉलन छवि के लिए आकार में फैला हुआ था)।

मेरी आईसीओ फ़ाइल में कई आकार हैं: 16*16, 32*32, 128*128, 256*256 आदि। मैंने पहले से ही केवल एक 128*128 आकार के साथ आइकन फ़ाइल सेट करने का प्रयास किया है, लेकिन यह काम नहीं किया।

क्या यह बिल्कुल काम करना चाहिए?

धन्यवाद।

+0

आप जानते हैं कि यह संभव है कि यह संभव नहीं है – tofutim

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ee330740(v=vs.85)।aspx # install_icon एक सुंदर कस्टम आइकन दिखाता है, इसलिए यह संभव है – tofutim

+0

समस्या के संदर्भ के लिए - http://stackoverflow.com/questions/35242400/windows-10-notifyicon-icon-always-looks-very-pixilated – tofutim

उत्तर

2

निम्न श्रेणी को विंडोज 10 पर गुब्बारा टिप में एक चिकनी, बड़ा आइकन प्रदर्शित करना चाहिए। इसका कोई मतलब पॉलिश नहीं है, लेकिन यह अवधारणा को साबित करना चाहिए। कोड का एक अच्छा हिस्सा सीधे डीकंपिल्ड माइक्रोसॉफ्ट नोटिफ़िकॉन क्लास से कॉपी किया गया है।

मूल NotifyIcon वर्ग के बीच महत्वपूर्ण परिवर्तन और इस प्रकार हैं:

  1. NOTIFYICONDATA.hBalloonIcon सदस्य के अलावा (और उपयोग)।
  2. NIIF_NONE के बजाय nOTIFYICONDATA.dwInfoFlags = NIIF_LARGE_ICON | NIIF_USER की सेटिंग।

आप NOTIFYICONDATA संरचना here की बारीकियों को पढ़ सकता है, लेकिन सार है:

  • hBalloonIcon विशेष रूप से सिस्टम ट्रे के बाहर उपयोग के लिए, Vista में जोड़ा गया है।
  • NIIF_USER गुब्बारा आइकन के रूप में hBalloonIcon में आइकन का उपयोग करने के लिए कहता है।
  • NIIF_LARGE_ICON कहता है कि गुब्बारा का आइकन बड़ा होना चाहिए।

NotifyIconLarge वर्ग:

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(); 
     } 
    } 
} 

कहीं यह घोषित:

private NotifyIconLarge _nil; 

तो इस तरह इसका इस्तेमाल:

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); 

समाप्त होने पर, ट्रे आइकन निकालें:

_nil.RemoveFromTray(); 
+0

मीठे देखें - इस दृष्टिकोण के बारे में सिर्फ डर रहा था - इसे जांचेंगे। – tofutim

संबंधित मुद्दे