NotifyIcon MouseDown MouseEventArgs没有位置数据

时间:2015-04-30 01:23:26

标签: c# .net wpf winforms notifyicon

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

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

然而,总是e.Location = {X=0,Y=0}。有没有办法使这项工作?

更新

奇怪的是,人们已经投票决定关闭这个问题并将其投票。但是,它显然无法正常工作,并且足够简单,无法在WPF应用程序的NotifyIcon文件中创建新的App.xaml.cs,并为自己尝试。

更新

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

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

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

  3. 显然,我是唯一一个关心.NET中这些不一致的人,而很多人似乎都容忍他们或者不理解他们的含义。

1 个答案:

答案 0 :(得分:0)

由于汉斯指出的framework is designed to not send proper mouse event arguments并不理想,但其中一个解决方法是使用MouseMove保存每个Cursor.Position上的最后一个位置并使用{{1}上的最后一个位置}作为上下文单击图标的位置。