Пример #1
0
        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));
        }
Пример #2
0
        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");
            }
        }