我在系统托盘中有一个NotifyIcon。如何检测用户何时左键单击它?我假设MouseDown
事件将是我想要使用的,但它只处理右键单击和中键单击。对于左键单击,它只有在用户放开后才会触发(就像他们刚刚执行了正常的单击一样)。有没有办法只获得MouseDown活动?
这是根据设计,shell合成来自up事件的MouseDown消息。当你点击并按住按钮,然后开始拖动时,你就会明白为什么它会以这种方式工作。请注意通知区域溢出窗口是如何弹出的,并允许您将图标拖动到其中以将其从可见区域中删除。这不可能两全其美。
从技术上讲,在Explorer使用SetWindowsHookEx()之前,您可以挂接Explorer.exe拥有的窗口来破解消息。然而,这需要一种你不能用C#编写的DLL,它需要注入到资源管理器中。非常不稳定,很难击败试图做同样事情的竞争对手。这类代码也让微软的appcompat团队彻夜难眠。
当用户单击图标时,底层Win32 API Shell_NotifyIcon
会发送WM_LBUTTONDOWN
消息。根据MSDN的说法。
检查NotifyIcon的Windows窗体源代码可以发现标准的鼠标按下事件处理,因此,如果Win32消息是在"正确"的时间发送的,它将按您的期望工作。
我不得不同意之前的评论,即NotifyIcon将吞下WM_LBUTTONDOWN,因为它需要进行鼠标捕获以允许用户拖动图标。
这篇关于为WPF创建托盘图标的文章可能会很有用,因为它展示了如何使用C#中的SetWindowsHookEx
等。