NotifyIcon MouseDown MouseEventArgs 没有位置数据

NotifyIcon MouseDown MouseEventArgs do not have location data

我在使用 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. 自其 post-mortem 以来,将 Cursor.Position 置于 MouseDown 内不会为您提供 MouseDown 在单击托盘图标。在您单击它和引发您可以进一步移动鼠标的事件之间有一个小的延迟。您可以使用一个应用程序自己对此进行测试,该应用程序通过在单击托盘并获取其在 MouseDown 处理程序中的位置后快速移动鼠标来获取鼠标坐标。解决方法(回答我的问题)是使用 Cursor.Position 保存每个 MouseMove 上的最后一个位置,并将 MouseDown 上的最后一个位置用作单击图标的位置。 所有这些都清楚地表明需要事件实际发生时的鼠标位置。

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

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

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

详情可以参考这个postGlobal mouse event handler