protected override void WndProc(ref Message m) { switch ((Msg)m.Msg) { // // NotifyIcon does CONTEXTMENU on mouse up, not down // so we swallow the message here, and handle it on our own // case Msg.WM_CONTEXTMENU: return; case Msg.WM_USER: { switch ((Msg)m.LParam.ToInt32()) { case Msg.WM_LBUTTONDOWN: { owner.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.WM_LBUTTONUP: { owner.OnMouseUp(new MouseEventArgs(MouseButtons.Left, 1, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.WM_LBUTTONDBLCLK: { owner.OnDoubleClick(EventArgs.Empty); owner.OnMouseDoubleClick(new MouseEventArgs(MouseButtons.Left, 2, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.WM_MOUSEMOVE: { owner.OnMouseMove(new MouseEventArgs(MouseButtons.None, 1, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.WM_RBUTTONDOWN: { owner.OnMouseDown(new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.WM_RBUTTONUP: { owner.OnMouseUp(new MouseEventArgs(MouseButtons.Right, 1, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.WM_RBUTTONDBLCLK: { owner.OnDoubleClick(EventArgs.Empty); owner.OnMouseDoubleClick(new MouseEventArgs(MouseButtons.Left, 2, Control.MousePosition.X, Control.MousePosition.Y, 0)); return; } case Msg.NIN_BALLOONUSERCLICK: { owner.OnBalloonTipClicked(EventArgs.Empty); return; } case Msg.NIN_BALLOONSHOW: { owner.OnBalloonTipShown(EventArgs.Empty); return; } case Msg.NIN_BALLOONHIDE: case Msg.NIN_BALLOONTIMEOUT: { owner.OnBalloonTipClosed(EventArgs.Empty); return; } } return; } } base.WndProc(ref m); }