【问题标题】:Does NotifyIcon have a MouseDown equivalent?NotifyIcon 是否有等效的 MouseDown?
【发布时间】:2012-02-29 22:39:06
【问题描述】:

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

【问题讨论】:

  • 我也尝试了几件事。你让我好奇。我什至还安装了 VS11 在那里试用。没运气。我几乎认为它是一个错误。我希望有人也有答案。
  • 我认为这可能与它可以拖动(由 Windows 本身而不是应用程序处理)这一事实有关。也许mousedown 事件正在被 Windows 吸收,而不是冒泡到应用程序。
  • 所以MSDN 上的这个完全不准确?

标签: c# winforms event-handling notifyicon mousedown


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    用户单击图标时,底层 Win32 API Shell_NotifyIcon 似乎会发送 WM_LBUTTONDOWN 消息。根据MSDN反正。

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

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

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

    【讨论】:

    • 这是否意味着mousedown事件是设计的,所以无法处理它?
    • 我认为没有什么简单的方法。在任务栏处理 WM_XXX 消息之前,可以在低级别(在 C++ 中)挂钩 WM_XXX 消息,但我已经很久没有做过类似的事情了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2016-10-26
    • 2023-03-04
    • 2012-02-26
    • 2010-09-22
    • 2013-01-26
    • 2019-11-02
    相关资源
    最近更新 更多