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