protected override void SetIcon(TrayIcons icon) { m_appIndicator.IconName = GetTrayIconFilename(icon); switch (icon) { case TrayIcons.Paused: m_appIndicator.IconDesc = "Paused"; break; case TrayIcons.Running: m_appIndicator.IconDesc = "Running"; break; case TrayIcons.IdleError: m_appIndicator.IconDesc = "Error"; break; case TrayIcons.RunningError: m_appIndicator.IconDesc = "Running"; break; case TrayIcons.PausedError: m_appIndicator.IconDesc = "Paused"; break; case TrayIcons.Idle: default: m_appIndicator.IconDesc = "Ready"; break; } }
protected static string GetTrayIconFilename(TrayIcons icon) { switch (icon) { case TrayIcons.Paused: return("normal-pause"); case TrayIcons.Running: return("normal-running"); case TrayIcons.IdleWarning: return("normal-warning"); case TrayIcons.IdleError: return("normal-error"); case TrayIcons.RunningError: return("normal-running"); case TrayIcons.PausedError: return("normal-pause"); case TrayIcons.Idle: default: return("normal"); } }
protected static Pixbuf GetIcon(TrayIcons icon) { if (!_images.ContainsKey(icon)) { switch (icon) { case TrayIcons.Paused: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.PauseIcon).ToBitmap()); break; case TrayIcons.Running: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.WorkingIcon).ToBitmap()); break; case TrayIcons.IdleError: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.ErrorIcon).ToBitmap()); break; case TrayIcons.RunningError: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.WorkingIcon).ToBitmap()); break; case TrayIcons.PausedError: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.PauseIcon).ToBitmap()); break; case TrayIcons.Idle: default: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.NormalIcon).ToBitmap()); break; } } return(_images[icon]); }
protected override void SetIcon(TrayIcons icon) { switch (icon) { case TrayIcons.IdleError: m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.ErrorIcon, System.Windows.Forms.SystemInformation.SmallIconSize); break; case TrayIcons.Paused: m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.PauseIcon, System.Windows.Forms.SystemInformation.SmallIconSize); break; case TrayIcons.PausedError: m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.PauseIcon, System.Windows.Forms.SystemInformation.SmallIconSize); break; case TrayIcons.Running: m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.WorkingIcon, System.Windows.Forms.SystemInformation.SmallIconSize); break; case TrayIcons.RunningError: m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.WorkingIcon, System.Windows.Forms.SystemInformation.SmallIconSize); break; case TrayIcons.Idle: default: m_trayIcon.Icon = ImageLoader.LoadIcon(ImageLoader.NormalIcon, System.Windows.Forms.SystemInformation.SmallIconSize); break; } }
protected static Pixbuf GetIcon(TrayIcons icon) { if (!_images.ContainsKey(icon)) { if (Platform.IsClientOSX) { switch (icon) { case TrayIcons.Paused: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.PauseIcon).ToBitmap()); break; case TrayIcons.Running: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.WorkingIcon).ToBitmap()); break; case TrayIcons.IdleWarning: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.WarningIcon).ToBitmap()); break; case TrayIcons.IdleError: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.ErrorIcon).ToBitmap()); break; case TrayIcons.RunningError: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.WorkingIcon).ToBitmap()); break; case TrayIcons.PausedError: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.PauseIcon).ToBitmap()); break; case TrayIcons.Idle: default: _images[icon] = ImageToPixbuf(ImageLoader.LoadIcon(ImageLoader.NormalIcon).ToBitmap()); break; } } else { _images[icon] = null; var filename = System.IO.Path.Combine(m_svgfolder, System.IO.Path.ChangeExtension(GetTrayIconFilename(icon), ".svg")); if (System.IO.File.Exists(filename)) { _images[icon] = new Pixbuf(filename); } } } return(_images[icon]); }
protected void OnStatusUpdated(IServerStatus status) { this.UpdateUIState(() => { switch (status.SuggestedStatusIcon) { case SuggestedStatusIcon.Active: Icon = TrayIcons.Running; break; case SuggestedStatusIcon.ActivePaused: Icon = TrayIcons.Paused; break; case SuggestedStatusIcon.ReadyError: Icon = TrayIcons.IdleError; break; case SuggestedStatusIcon.ReadyWarning: Icon = TrayIcons.IdleError; break; case SuggestedStatusIcon.Paused: Icon = TrayIcons.Paused; break; case SuggestedStatusIcon.Ready: default: Icon = TrayIcons.Idle; break; } if (status.ProgramState == LiveControlState.Running) { m_pauseMenu.Icon = MenuIcons.Pause; m_pauseMenu.Text = "Pause"; m_stateIsPaused = false; } else { m_pauseMenu.Icon = MenuIcons.Resume; m_pauseMenu.Text = "Resume"; m_stateIsPaused = true; } }); }
/// <summary> /// Hide all tray icons to prevent them hanging useless in the system tray /// </summary> /// <param name="cancellationToken">CancellationToken</param> /// <returns>Task</returns> public async Task ShutdownAsync(CancellationToken cancellationToken = default) { var trayIcons = TrayIcons.ToList(); if (trayIcons.Any()) { Log.Debug().WriteLine("Hiding all created tray-icons"); await Execute.OnUIThreadAsync(() => { Log.Debug().WriteLine("Hiding {0} tray-icons", trayIcons.Count); foreach (var trayIcon in trayIcons) { trayIcon.Hide(); } }).ConfigureAwait(false); } else { Log.Debug().WriteLine("No tray-icons to hide"); } }
private bool SysTrayCallback(uint message, SafeNotifyIconData nicData) { if (nicData.hWnd == IntPtr.Zero) { return(false); } NotifyIcon trayIcon = new NotifyIcon(this, nicData.hWnd); trayIcon.UID = nicData.uID; lock (_lockObject) { if ((NIM)message == NIM.NIM_ADD || (NIM)message == NIM.NIM_MODIFY) { try { bool exists = false; bool titleChanged = false; // hide icons while we are shell which require UWP support & we have a separate implementation for if (nicData.guidItem == new Guid(VOLUME_GUID) && ((EnvironmentHelper.IsAppRunningAsShell && EnvironmentHelper.IsWindows10OrBetter) || GroupPolicyHelper.HideScaVolume)) { return(false); } // hide icons per group policy if ((nicData.guidItem == new Guid(HEALTH_GUID) && GroupPolicyHelper.HideScaHealth) || (nicData.guidItem == new Guid(MEETNOW_GUID) && GroupPolicyHelper.HideScaMeetNow) || (nicData.guidItem == new Guid(NETWORK_GUID) && GroupPolicyHelper.HideScaNetwork) || (nicData.guidItem == new Guid(POWER_GUID) && GroupPolicyHelper.HideScaPower)) { return(false); } foreach (NotifyIcon ti in TrayIcons) { if (ti.Equals(nicData)) { exists = true; trayIcon = ti; break; } } if ((NIF.STATE & nicData.uFlags) != 0) { trayIcon.IsHidden = nicData.dwState == 1; } if ((NIF.TIP & nicData.uFlags) != 0 && !string.IsNullOrEmpty(nicData.szTip)) { trayIcon.Title = nicData.szTip; titleChanged = true; } if ((NIF.ICON & nicData.uFlags) != 0) { if (nicData.hIcon != IntPtr.Zero) { System.Windows.Media.ImageSource icon = IconImageConverter.GetImageFromHIcon(nicData.hIcon, false); if (icon != null) { trayIcon.Icon = icon; } else if (icon == null && trayIcon.Icon == null) { // Use default only if we don't have a valid icon already trayIcon.Icon = IconImageConverter.GetDefaultIcon(); } } else { trayIcon.Icon = null; } } trayIcon.HWnd = nicData.hWnd; trayIcon.UID = nicData.uID; if ((NIF.GUID & nicData.uFlags) != 0) { trayIcon.GUID = nicData.guidItem; } if (nicData.uVersion > 0 && nicData.uVersion <= 4) { trayIcon.Version = nicData.uVersion; } if ((NIF.MESSAGE & nicData.uFlags) != 0) { trayIcon.CallbackMessage = nicData.uCallbackMessage; } if (!exists) { // default placement to a menu bar-like rect trayIcon.Placement = defaultPlacement; // set properties used for pinning trayIcon.Path = ShellHelper.GetPathForWindowHandle(trayIcon.HWnd); trayIcon.SetPinValues(); if (trayIcon.Icon == null) { trayIcon.Icon = IconImageConverter.GetDefaultIcon(); } TrayIcons.Add(trayIcon); if ((NIF.INFO & nicData.uFlags) != 0) { handleBalloonData(nicData, trayIcon); } ShellLogger.Debug($"NotificationArea: Added: {trayIcon.Title} Path: {trayIcon.Path} Hidden: {trayIcon.IsHidden} GUID: {trayIcon.GUID} UID: {trayIcon.UID} Version: {trayIcon.Version}"); if ((NIM)message == NIM.NIM_MODIFY) { // return an error to the notifyicon as we received a modify for an icon we did not yet have return(false); } } else { if ((NIF.INFO & nicData.uFlags) != 0) { handleBalloonData(nicData, trayIcon); } if (titleChanged && trayIcon.GUID == default && !trayIcon.IsPinned) { // set properties used for pinning trayIcon.SetPinValues(); } ShellLogger.Debug($"NotificationArea: Modified: {trayIcon.Title}"); } } catch (Exception ex) { ShellLogger.Error("NotificationArea: Unable to modify the icon in the collection.", ex); } } else if ((NIM)message == NIM.NIM_DELETE) { try { foreach (var icon in TrayIcons) { if (icon.Equals(trayIcon)) { TrayIcons.Remove(trayIcon); ShellLogger.Debug($"NotificationArea: Removed: {icon.Title}"); return(true); } } return(false); } catch (Exception ex) { ShellLogger.Error("NotificationArea: Unable to remove the icon from the collection.", ex); } } else if ((NIM)message == NIM.NIM_SETVERSION) { if (nicData.uVersion > 4) { return(false); } foreach (NotifyIcon ti in TrayIcons) { if (ti.Equals(nicData)) { ti.Version = nicData.uVersion; ShellLogger.Debug($"NotificationArea: Modified version to {ti.Version} on: {ti.Title}"); break; } } } } return(true); }
private bool SysTrayCallback(uint message, SafeNotifyIconData nicData) { if (nicData.hWnd == IntPtr.Zero) { return(false); } NotifyIcon trayIcon = new NotifyIcon(nicData.hWnd); trayIcon.UID = nicData.uID; lock (_lockObject) { if ((NIM)message == NIM.NIM_ADD || (NIM)message == NIM.NIM_MODIFY) { try { bool exists = false; // hide icons while we are shell which require UWP support & we have a separate implementation for if (nicData.guidItem == new Guid(VOLUME_GUID) && ((Shell.IsCairoRunningAsShell && Shell.IsWindows10OrBetter) || GroupPolicyManager.Instance.HideScaVolume)) { return(false); } foreach (NotifyIcon ti in TrayIcons) { if (ti.Equals(nicData)) { exists = true; trayIcon = ti; break; } } if ((NIF.STATE & nicData.uFlags) != 0) { trayIcon.IsHidden = nicData.dwState == 1; } if ((NIF.TIP & nicData.uFlags) != 0 && !string.IsNullOrEmpty(nicData.szTip)) { trayIcon.Title = nicData.szTip; } if ((NIF.ICON & nicData.uFlags) != 0) { if (nicData.hIcon != IntPtr.Zero) { try { System.Windows.Media.Imaging.BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon( nicData.hIcon, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); DestroyIcon(nicData.hIcon); if (bs != null) { bs.Freeze(); trayIcon.Icon = bs; } } catch { if (trayIcon.Icon == null) { trayIcon.Icon = Common.IconImageConverter.GetDefaultIcon(); } } } else { trayIcon.Icon = null; } } trayIcon.HWnd = nicData.hWnd; trayIcon.UID = nicData.uID; if ((NIF.GUID & nicData.uFlags) != 0) { trayIcon.GUID = nicData.guidItem; } // guess version in case we are receiving icons that aren't sending NIM_SETVERSION to new explorers if ((NIF.VISTA_MASK & nicData.uFlags) != 0) { trayIcon.Version = 4; } else if ((NIF.XP_MASK & nicData.uFlags) != 0) { trayIcon.Version = 3; } if (nicData.uVersion > 0 && nicData.uVersion <= 4) { trayIcon.Version = nicData.uVersion; } if ((NIF.MESSAGE & nicData.uFlags) != 0) { trayIcon.CallbackMessage = nicData.uCallbackMessage; } if (!exists) { // default placement to a menu bar-like rect trayIcon.Placement = defaultPlacement; // set properties used for pinning trayIcon.Path = Shell.GetPathForHandle(trayIcon.HWnd); trayIcon.SetPinValues(); if (trayIcon.Icon == null) { trayIcon.Icon = Common.IconImageConverter.GetDefaultIcon(); } TrayIcons.Add(trayIcon); CairoLogger.Instance.Debug($"NotificationArea: Added: {trayIcon.Title} Path: {trayIcon.Path} Hidden: {trayIcon.IsHidden} GUID: {trayIcon.GUID} UID: {trayIcon.UID} Version: {trayIcon.Version}"); if ((NIM)message == NIM.NIM_MODIFY) { // return an error to the notifyicon as we received a modify for an icon we did not yet have return(false); } } else { CairoLogger.Instance.Debug($"NotificationArea: Modified: {trayIcon.Title}"); } } catch (Exception ex) { CairoLogger.Instance.Error("NotificationArea: Unable to modify the icon in the collection.", ex); } } else if ((NIM)message == NIM.NIM_DELETE) { try { if (!TrayIcons.Contains(trayIcon)) { // Nothing to remove. return(false); } TrayIcons.Remove(trayIcon); CairoLogger.Instance.Debug($"NotificationArea: Removed: {nicData.szTip}"); } catch (Exception ex) { CairoLogger.Instance.Error("NotificationArea: Unable to remove the icon from the collection.", ex); } } else if ((NIM)message == NIM.NIM_SETVERSION) { foreach (NotifyIcon ti in TrayIcons) { if (ti.Equals(nicData)) { ti.Version = nicData.uVersion; CairoLogger.Instance.Debug($"NotificationArea: Modified version to {ti.Version} on: {ti.Title}"); break; } } } } return(true); }
protected override void SetIcon(TrayIcons icon) { m_trayIcon.Pixbuf = GetIcon(icon); }
public static void SetIcons(Application o, TrayIcons trayIcons) => o.SetValue(IconsProperty, trayIcons);
private bool SysTrayCallback(uint message, NOTIFYICONDATA nicData) { TrayIcon trayIcon = new TrayIcon(nicData.hWnd); if (nicData.uID != null) { trayIcon.UID = nicData.uID; } lock (_lockObject) { switch ((NIM)message) { case NIM.NIM_ADD: // Ensure the icon doesn't already exist. if (TrayIcons.Contains(trayIcon)) { return(false); } // Add the icon. trayIcon.Title = nicData.szTip; try { trayIcon.Icon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(nicData.hIcon, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); } catch { trayIcon.Icon = null; } trayIcon.HWnd = nicData.hWnd; trayIcon.UID = nicData.uID; trayIcon.CallbackMessage = nicData.uCallbackMessage; TrayIcons.Add(trayIcon); break; case NIM.NIM_DELETE: try { if (!TrayIcons.Contains(trayIcon)) { // Nothing to remove. return(false); } // Woo! Using Linq to avoid iterating! TrayIcons.Remove(trayIcon); } catch (Exception ex) { Trace.WriteLine("Unable to remove the icon from the collection. Error: " + ex.ToString()); } break; case NIM.NIM_MODIFY: try { bool exists = false; if (TrayIcons.Contains(trayIcon)) { exists = true; trayIcon = TrayIcons.Single(i => i.HWnd == nicData.hWnd && i.UID == nicData.uID); } trayIcon.Title = nicData.szTip; trayIcon.Icon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(nicData.hIcon, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); trayIcon.HWnd = nicData.hWnd; trayIcon.UID = nicData.uID; trayIcon.CallbackMessage = nicData.uCallbackMessage; if (!exists) { TrayIcons.Add(trayIcon); } } catch (Exception ex) { Trace.WriteLine("Unable to modify the icon in the collection. Error: " + ex.ToString()); } break; } } return(true); }
private bool SysTrayCallback(uint message, NOTIFYICONDATA nicData) { if (nicData.hWnd == 0) { return(false); } NotifyIcon trayIcon = new NotifyIcon((IntPtr)nicData.hWnd); trayIcon.UID = nicData.uID; lock (_lockObject) { if ((NIM)message == NIM.NIM_ADD || (NIM)message == NIM.NIM_MODIFY) { try { bool exists = false; if (nicData.dwState != 1) { if (nicData.guidItem == new Guid(VOLUME_GUID)) { return(false); } foreach (NotifyIcon ti in TrayIcons) { if ((nicData.guidItem != Guid.Empty && nicData.guidItem == ti.GUID) || (ti.HWnd == (IntPtr)nicData.hWnd && ti.UID == nicData.uID)) { exists = true; trayIcon = ti; break; } } if ((NIF.TIP & nicData.uFlags) != 0 && !string.IsNullOrEmpty(nicData.szTip)) { trayIcon.Title = nicData.szTip; } if ((NIF.ICON & nicData.uFlags) != 0) { if ((IntPtr)nicData.hIcon != IntPtr.Zero) { try { System.Windows.Media.Imaging.BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon((IntPtr)nicData.hIcon, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); if (bs != null) { trayIcon.Icon = bs; } } catch { if (trayIcon.Icon == null) { trayIcon.Icon = Common.IconImageConverter.GetDefaultIcon(); } } } else { trayIcon.Icon = null; } } trayIcon.HWnd = (IntPtr)nicData.hWnd; trayIcon.UID = nicData.uID; trayIcon.GUID = nicData.guidItem; // guess version in case we are receiving icons that aren't sending NIM_SETVERSION to new explorers if ((NIF.VISTA_MASK & nicData.uFlags) != 0) { trayIcon.Version = 4; } else if ((NIF.XP_MASK & nicData.uFlags) != 0) { trayIcon.Version = 3; } if (nicData.uVersion > 0 && nicData.uVersion <= 4) { trayIcon.Version = nicData.uVersion; } if ((NIF.MESSAGE & nicData.uFlags) != 0) { trayIcon.CallbackMessage = nicData.uCallbackMessage; } if (!exists) { // default placement to a menu bar like rect trayIcon.Placement = defaultPlacement; // set pinned item properties trayIcon.Path = Shell.GetPathForHandle(trayIcon.HWnd); trayIcon.SetPinValues(); if (trayIcon.Icon == null) { trayIcon.Icon = Common.IconImageConverter.GetDefaultIcon(); } TrayIcons.Add(trayIcon); CairoLogger.Instance.Debug("Added tray icon: " + trayIcon.Title + " path: " + Shell.GetPathForHandle(trayIcon.HWnd) + " GUID: " + trayIcon.GUID + " UID: " + trayIcon.UID); if ((NIM)message == NIM.NIM_MODIFY) { // return an error to the notifyicon as we received a modify for an icon we did not yet have return(false); } } else { CairoLogger.Instance.Debug("Modified tray icon: " + trayIcon.Title); } } } catch (Exception ex) { CairoLogger.Instance.Error("Unable to modify the icon in the collection.", ex); } } else if ((NIM)message == NIM.NIM_DELETE) { try { if (!TrayIcons.Contains(trayIcon)) { // Nothing to remove. return(false); } TrayIcons.Remove(trayIcon); CairoLogger.Instance.Debug("Removed tray icon: " + nicData.szTip); } catch (Exception ex) { CairoLogger.Instance.Error("Unable to remove the icon from the collection.", ex); } } else if ((NIM)message == NIM.NIM_SETVERSION) { foreach (NotifyIcon ti in TrayIcons) { if ((nicData.guidItem != Guid.Empty && nicData.guidItem == ti.GUID) || (ti.HWnd == (IntPtr)nicData.hWnd && ti.UID == nicData.uID)) { ti.Version = nicData.uVersion; CairoLogger.Instance.Debug("Modified version to " + ti.Version + " on tray icon: " + ti.Title); break; } } } } return(true); }
protected abstract void SetIcon(TrayIcons icon);
protected static Pixbuf GetIcon(TrayIcons icon) { if (!_images.ContainsKey(icon)) { switch(icon) { case TrayIcons.Paused: _images[icon] = ImageToPixbuf(ImageLoader.TrayNormalPause.ToBitmap()); break; case TrayIcons.Running: _images[icon] = ImageToPixbuf(ImageLoader.TrayWorking.ToBitmap()); break; case TrayIcons.IdleError: _images[icon] = ImageToPixbuf(ImageLoader.TrayNormalError.ToBitmap()); break; case TrayIcons.RunningError: _images[icon] = ImageToPixbuf(ImageLoader.TrayWorking.ToBitmap()); break; case TrayIcons.PausedError: _images[icon] = ImageToPixbuf(ImageLoader.TrayNormalPause.ToBitmap()); break; case TrayIcons.Idle: default: _images[icon] = ImageToPixbuf(ImageLoader.TrayNormal.ToBitmap()); break; } } return _images[icon]; }
public static void SetIcons(AvaloniaObject o, TrayIcons trayIcons) => o.SetValue(IconsProperty, trayIcons);
protected override void SetIcon(TrayIcons icon) { m_statusItem.Image = GetIcon(icon); }
protected void OnStatusUpdated(IServerStatus status) { this.UpdateUIState(() => { switch(status.SuggestedStatusIcon) { case SuggestedStatusIcon.Active: Icon = TrayIcons.Running; break; case SuggestedStatusIcon.ActivePaused: Icon = TrayIcons.Paused; break; case SuggestedStatusIcon.ReadyError: Icon = TrayIcons.IdleError; break; case SuggestedStatusIcon.ReadyWarning: Icon = TrayIcons.IdleError; break; case SuggestedStatusIcon.Paused: Icon = TrayIcons.Paused; break; case SuggestedStatusIcon.Ready: default: Icon = TrayIcons.Idle; break; } if (status.ProgramState == LiveControlState.Running) { m_pauseMenu.Icon = MenuIcons.Pause; m_pauseMenu.Text = "Pause"; m_stateIsPaused = false; } else { m_pauseMenu.Icon = MenuIcons.Resume; m_pauseMenu.Text = "Resume"; m_stateIsPaused = true; } }); }
protected override void SetIcon(TrayIcons icon) { m_lastIcon = icon; m_toRumps.WriteNoWait(JsonConvert.SerializeObject(new { Action = "seticon", Image = GetIcon(icon) })); }
private bool SysTrayCallback(uint message, NOTIFYICONDATA nicData) { Console.WriteLine(message + " - " + nicData.uID); lock (_lockObject) { TrayIcon trayIcon; switch ((NIM)message) { case NIM.NIM_ADD: trayIcon = new TrayIcon((IntPtr)nicData.hWnd); trayIcon.UID = (uint)nicData.uID; // Ensure the icon doesn't already exist. if (TrayIcons.Contains(trayIcon)) { return(false); } // Add the icon. trayIcon.Title = nicData.szTip; try { trayIcon.Icon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon((IntPtr)nicData.hIcon, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); } catch { trayIcon.Icon = null; } trayIcon.HWnd = (IntPtr)nicData.hWnd; trayIcon.UID = (uint)nicData.uID; trayIcon.CallbackMessage = (uint)nicData.uCallbackMessage; TrayIcon old = TrayIcons.FirstOrDefault(i => i.HWnd == (IntPtr)nicData.hWnd); if (old != null) { TrayIcons.Remove(old); } TrayIcons.Add(trayIcon); break; case NIM.NIM_DELETE: try { TrayIcon oldTrayIcon = TrayIcons.FirstOrDefault(i => i.HWnd == (IntPtr)nicData.hWnd); if (oldTrayIcon != null) { TrayIcons.Remove(oldTrayIcon); } else { return(false); } } catch (Exception ex) { Trace.WriteLine("Unable to remove the icon from the collection. Error: " + ex.ToString()); } break; case NIM.NIM_MODIFY: try { trayIcon = TrayIcons.Single(i => i.HWnd == (IntPtr)nicData.hWnd); if (trayIcon == null) { break; } trayIcon.Title = nicData.szTip; trayIcon.Icon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon((IntPtr)nicData.hIcon, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); trayIcon.HWnd = (IntPtr)nicData.hWnd; trayIcon.UID = (uint)nicData.uID; trayIcon.CallbackMessage = (uint)nicData.uCallbackMessage; TrayIcons.Remove(trayIcon); TrayIcons.Add(trayIcon); } catch (Exception ex) { Trace.WriteLine("Unable to modify the icon in the collection. Error: " + ex.ToString()); } break; } } return(true); }