public static int CreateNotifyIcon(INotifyIconCallback messageCallback, Bitmap icon) { int Id = NotifyIconInteropHelper.nextNotifyIconId++; NotifyIconInteropHelper.HookWindow.AddMessageHook(Id, messageCallback); NotifyIconInteropHelper.iconHandles.Add(Id, icon.GetHicon()); NotifyIconData IconData = new NotifyIconData { cbSize = Marshal.SizeOf(typeof(NotifyIconData)) }; IconData.hwnd = NotifyIconInteropHelper.HookWindow.Handle; IconData.uID = Id; IconData.uFlags = 0x00000003; // NIF_Message (1), NIF_ICON (2) IconData.uCallbackMessage = (int)Win32.Wm.App; IconData.hIcon = NotifyIconInteropHelper.iconHandles[Id]; IconData.uVersion = 3; //Window 2000 and later (4 would be Vista and later). Changes message handling! NotifyIconInteropHelper.Shell_NotifyIcon(NotifyMessage.Add, ref IconData); NotifyIconInteropHelper.Shell_NotifyIcon(NotifyMessage.SetVersion, ref IconData); return(Id); }
public void AddMessageHook(int id, INotifyIconCallback callback) { this.registrations.Add(id, new Registration(callback)); }
public Registration(INotifyIconCallback callback) { this.Callback = callback; this.LastMousePosition = null; this.IsMouseOver = false; }
private IntPtr ProcessMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { Trace.Assert(hwnd == this.Handle, "Target window unknown"); if (msg == (int)Win32.Wm.App) { int Id = wParam.ToInt32(); int Message = lParam.ToInt32(); if (this.registrations.ContainsKey(Id)) { Registration Registration = this.registrations[Id]; INotifyIconCallback Callback = Registration.Callback; try { switch ((Win32.Wm)Message) { case Win32.Wm.Mousemove: Callback.MouseMoved(); // if (this.mouseHook != null) // { // Registration.LastMousePosition = null; // if (Registration.IsMouseOver == false) // { // Registration.IsMouseOver = true; // Callback.MouseEnter(); // } // } break; case Win32.Wm.Rbuttonup: Callback.MouseButtonUp(MouseButton.Right); break; case Win32.Wm.Rbuttondown: Callback.MouseButtonDown(MouseButton.Right); break; case Win32.Wm.Rbuttondblclk: Callback.MouseButtonDoubleClick(MouseButton.Right); break; case Win32.Wm.Lbuttonup: Callback.MouseButtonUp(MouseButton.Left); break; case Win32.Wm.Lbuttondown: Callback.MouseButtonDown(MouseButton.Left); break; case Win32.Wm.Lbuttondblclk: Callback.MouseButtonDoubleClick(MouseButton.Left); break; case Win32.Wm.Mbuttonup: Callback.MouseButtonUp(MouseButton.Middle); break; case Win32.Wm.Mbuttondown: Callback.MouseButtonDown(MouseButton.Middle); break; case Win32.Wm.Mbuttondblclk: Callback.MouseButtonDoubleClick(MouseButton.Middle); break; case Win32.Wm.Contextmenu: Callback.ContextMenu(); break; default: //unknown message ignore break; } handled = true; } // ReSharper disable EmptyGeneralCatchClause catch { } // ReSharper restore EmptyGeneralCatchClause return(IntPtr.Zero); } else { Trace.Fail("Notify Icon Message was received for unknown uID!"); return(IntPtr.Zero); } } else if (msg == this.notificationAreaCreatedMessage) { foreach (Registration Registration in this.registrations.Values) { Registration.Callback.RecreationRequired(); } return(IntPtr.Zero); } else { return(IntPtr.Zero); } }
public NotifyIconInteropWrapper(INotifyIconCallback callback) { this.callback = callback; }