private IntPtr OnWindowMessageInternal(IntPtr hWnd, uint messageId, IntPtr wParam, IntPtr lParam) { if (messageId == taskbarWindowMessageId) { TaskbarCreated?.Invoke(); } WindowMessage?.Invoke(messageId, wParam, lParam); return(NativeMethods.DefWindowProc(hWnd, messageId, wParam, lParam)); }
public WindowMessageSink(Shell32.ENotifyIconVersion version = Shell32.ENotifyIconVersion.Win95) : this() { Version = version; // Get the message used to indicate the taskbar has been restarted // This is used to re-add icons when the taskbar restarts TaskbarRestartMessageID = Win32.RegisterWindowMessage("TaskbarCreated"); // Create a hidden dummy window var wc = new Win32.WNDCLASS { style = 0, lpfnWndProc = m_message_handler = OnWindowMessageReceived, cbClsExtra = 0, cbWndExtra = 0, hInstance = IntPtr.Zero, hIcon = IntPtr.Zero, hCursor = IntPtr.Zero, hbrBackground = IntPtr.Zero, lpszMenuName = string.Empty, lpszClassName = WindowId, }; IntPtr OnWindowMessageReceived(IntPtr hWnd, int message_id, IntPtr wParam, IntPtr lParam) { // Recreate the icon if the taskbar was restarted (e.g. due to Win Explorer shutdown) if (message_id == TaskbarRestartMessageID) { TaskbarCreated?.Invoke(this, EventArgs.Empty); } // Forward the message ProcessWindowMessage(message_id, wParam, lParam); return(Win32.DefWindowProc(hWnd, message_id, wParam, lParam)); } Win32.RegisterClass(wc); // Create the message window HWnd = Win32.CreateWindow(0, WindowId, "", 0, 0, 0, 1, 1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (HWnd == IntPtr.Zero) { throw new Win32Exception("Failed to create window for notification icon"); } }