2015-08-03 4 views
1

Я разрабатываю приложение в C# .net, и для этого я пишу код для отображения значка в системном трее, и всякий раз, когда появляется новое сообщение, всплывающая подсказка будет показана там, который имеет событие click, которое откроет новое сообщение, все работает нормально, но проблема в том, что я получаю несколько номеров значков, сгенерированных в системном трее, которые были единственными, как я могу предотвратить это? Я нашел в Интернете, как распоряжаться они, но не смогли найти способ предотвратить более одного. Или есть лучший способ показать уведомления для вновь полученного сообщения. Пожалуйста, помогите мне, если вы знаете решение.предотвращает больше одного значка в трее в C#

+0

Небольшой код может помочь. –

+0

... и где ваш код, который создает ваши значки? –

+0

WPF или winform? – CharithJ

ответ

1

Есть более доступные варианты решений here и here для некоторых примеров.

Однако системный лоток не обновляется автоматически. Если вы показываете/скрываете несколько значков в системном трее, это может повредить лоток. Обычно все расположенные значки исчезают при наведении курсора мыши. Тем не менее, есть способ программно обновить системный лоток. Ссылка here.

Примечание: Функция SendMessage отправляет указанное сообщение в окно или окна. Функция SendMessage вызывает оконную процедуру для указанного окна и не возвращается до тех пор, пока оконная процедура не обработает сообщение.

[StructLayout(LayoutKind.Sequential)] 
    public struct RECT 
    { 
     public int left; 
     public int top; 
     public int right; 
     public int bottom; 
    } 
    [DllImport("user32.dll")] 
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    [DllImport("user32.dll")] 
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 
    [DllImport("user32.dll")] 
    public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect); 
    [DllImport("user32.dll")] 
    public static extern IntPtr SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam); 


    public void RefreshTrayArea() 
    { 
     IntPtr systemTrayContainerHandle = FindWindow("Shell_TrayWnd", null); 
     IntPtr systemTrayHandle = FindWindowEx(systemTrayContainerHandle, IntPtr.Zero, "TrayNotifyWnd", null); 
     IntPtr sysPagerHandle = FindWindowEx(systemTrayHandle, IntPtr.Zero, "SysPager", null); 
     IntPtr notificationAreaHandle = FindWindowEx(sysPagerHandle, IntPtr.Zero, "ToolbarWindow32", "Notification Area"); 
     if (notificationAreaHandle == IntPtr.Zero) 
     { 
      notificationAreaHandle = FindWindowEx(sysPagerHandle, IntPtr.Zero, "ToolbarWindow32", "User Promoted Notification Area"); 
      IntPtr notifyIconOverflowWindowHandle = FindWindow("NotifyIconOverflowWindow", null); 
      IntPtr overflowNotificationAreaHandle = FindWindowEx(notifyIconOverflowWindowHandle, IntPtr.Zero, "ToolbarWindow32", "Overflow Notification Area"); 
      RefreshTrayArea(overflowNotificationAreaHandle); 
     } 
     RefreshTrayArea(notificationAreaHandle); 
    } 


    private static void RefreshTrayArea(IntPtr windowHandle) 
    { 
     const uint wmMousemove = 0x0200; 
     RECT rect; 
     GetClientRect(windowHandle, out rect); 
     for (var x = 0; x < rect.right; x += 5) 
      for (var y = 0; y < rect.bottom; y += 5) 
       SendMessage(windowHandle, wmMousemove, 0, (y << 16) + x); 
    } 
+0

Большое вам спасибо за ваш ответ, но не могли бы вы рассказать мне, где поставить этот код и как его вызвать ..? –

+0

@Software_developer: Возможно, в классе, где вы показываете уведомление. Обновите лоток до или после отображения нового уведомления. – CharithJ