NotifyIcon是否具有MouseDown等价物?

时间:2012-02-29 22:39:06

标签: c# winforms event-handling notifyicon mousedown

我在系统托盘中有一个NotifyIcon。如何检测用户何时左键单击它?我假设MouseDown事件将是我想要使用的事件,但它只处理右键单击和中键单击。对于左键单击,它仅在用户放开后触发(就像他们刚刚执行了正常点击一样)。有没有办法只获取MouseDown事件?

2 个答案:

答案 0 :(得分:4)

这是设计,shell从up事件合成MouseDown消息。当您单击并按住按钮然后开始拖动时,您将看到为什么它以这种方式工作。请注意如何弹出通知区域溢出窗口,并允许您将图标拖入其中以将其从可见区域中删除。它无法双向发挥作用。

从技术上讲,您可以挂钩Explorer.exe拥有的窗口,以便在资源管理器使用SetWindowsHookEx()之前对消息进行破解。然而,这需要一种你无法用C#编写的DLL,它需要注入Explorer。非常不稳定,很难击败试图做同样事情的竞争。也是那种导致Microsoft appcompat团队失眠的代码。

答案 1 :(得分:3)

用户点击图标时,基础Win32 API Shell_NotifyIcon似乎会发送WM_LBUTTONDOWN消息。无论如何,根据MSDN

检查NotifyIcon的Windows窗体源代码显示标准鼠标按下事件处理,因此如果在“正确”时间发送Win32消息,它将按您希望/期望的方式工作。

我必须同意之前的评论,NotifyIcon将吞下WM_LBUTTONDOWN,因为它需要进行鼠标捕获以允许用户拖动图标。

有关为WPF创建托盘图标的this article可能会有用,因为它显示了如何使用C#中的SetWindowsHookEx等。