【问题标题】:NotifyIcon MouseDown MouseEventArgs do not have location dataNotifyIcon MouseDown MouseEventArgs 没有位置数据
【发布时间】:2015-04-30 01:23:26
【问题描述】:

我在使用 Forms 集成的 WPF 应用程序中为 NotifyIcon 提供了以下事件处理程序:

void MyNotifyIcon_MouseDown(Object sender, System.Windows.Forms.MouseEventArgs e)
{
    ShowSettingsWindow();
}

但是,e.Location = {X=0,Y=0} 始终如此。有没有办法让这个工作?

更新

奇怪的是,人们投票结束这个问题并投了反对票。但是,它显然无法正常工作,也很简单,无法在 WPF 应用程序的 App.xaml.cs 文件中创建一个新的 NotifyIcon 并自己尝试一下。

更新

正如 Hans 指出的,这是设计使然。它仍然没有回答可能的解决方法是什么的问题。此外,这是一个糟糕的设计,因为:

  1. 此事件发生在 MouseDown 上,这意味着当它被单击时它应该具有鼠标位置的一些上下文,以便它发生。 NotifyIcon 的 WmMouseDown 处理程序确实具有 ref Message m 属性 which other controls use to establish the correct position,但它似乎忽略了此属性并且不在事件处理程序中使用它。我认为这是一个重大错误。

  2. 自其事后分析以来,在MouseDown 中获取Cursor.Position 不会为您提供单击托盘图标后鼠标按下的确切最后位置。在您单击它和引发您可以进一步移动鼠标的事件之间有一个小的延迟。您可以使用一个应用程序自行测试这一点,该应用程序通过在单击托盘后快速移动鼠标并获取其在MouseDown 处理程序中的位置来获取鼠标坐标。一种解决方法(回答我的问题)是使用Cursor.Position 保存每个MouseMove 上的最后一个位置,并使用MouseDown 上的最后一个位置作为单击图标的位置。 所有这些都明确需要鼠标定位事件实际发生的时间。

显然,我是唯一一个关心 .NET 中这些不一致之处的人,而很多人似乎容忍它们或没有正确理解它们的含义。

【问题讨论】:

  • 这完全是by design
  • @HansPassant 糟糕的设计。
  • 当然不是,当图标可以随时随意改变位置时,鼠标位置是没有意义的。
  • @HansPassant 什么?!它在一个 MouseDown 事件上,当它被点击时应该有一些鼠标位置的上下文。要让它发生,显然它一定是在某个时候被点击的。
  • @HansPassant NotifyIconWmMouseDown 处理程序确实具有其他控件使用 (referencesource.microsoft.com/#System.Windows.Forms/winforms/…) 建立正确位置的 ref Message m 属性,但是它似乎忽略了此属性而不是在事件处理程序中使用它。糟糕的设计。我什至称其为重大错误。

标签: c# .net wpf winforms notifyicon


【解决方案1】:

它并不理想,因为正如 Hans 指出的那样,framework is designed to not send proper mouse event arguments,但一种解决方法是使用 Cursor.Position 保存每个 MouseMove 上的最后一个位置,并使用 MouseDown 上的最后一个位置作为上下文单击的位置图标。

【讨论】:

    【解决方案2】:

    您是否考虑过设置全局鼠标挂钩?它将绕过典型的 WPF 事件模型,您必须手动确定坐标。这可能涉及额外的 API 调用。

    详情可在此帖Global mouse event handler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      相关资源
      最近更新 更多