获取鼠标双击事件的位置/按钮

9

在控件的DoubleClick事件中,有没有一种方法可以获取鼠标指针的(x, y)坐标?

据我所知,位置必须从全局获取:

Windows.Forms.Cursor.Position.X,Windows.Forms.Cursor.Position.Y

此外,是否有一种方法可以获取产生双击的按钮?


奇怪的是在调试时你可以看到里面的值,但无论如何进行强制转换都不能访问它。 - John Lord
3个回答

16

使用MouseDoubleClick事件而不是DoubleClick事件。MouseDoubleClick提供了MouseEventArgs而不是普通的EventArgs。这同样适用于"MouseClick"而不是"Click",以及所有与鼠标相关的其他事件。

MouseDoubleClick确保鼠标确实在那里。 DoubleClick可能是由其他原因引起的,鼠标坐标可能无用 - MSDN: "DoubleClick事件是控件的逻辑高级事件。它们可能由其他用户操作(例如快捷键组合)引发。”


12

注意:正如danbruc指出的那样,这在UserControl上不起作用,因为e不是MouseEventArgs。还要注意的是,并非所有控件都会给您一个DoubleClick事件——例如,Button只会向您发送两个Click事件。

  private void Form1_DoubleClick(object sender, EventArgs e)
   {
       MouseEventArgs me = e as MouseEventArgs;

       MouseButtons buttonPushed = me.Button;
       int xPos = me.X;
       int yPos = me.Y;
   }

获取相对于表单的 x,y 坐标。

在 MouseEventArgs 中还包含左键或右键信息。


哦,是的...刚忘了最简单的事情... :D - Daniel Brückner
哦不...我将会是null,因为事件参数不是MouseEventArgs,所以它不起作用。 - Daniel Brückner
@danbruc - 呃,我刚试了一下以确保...它对我有效?也许我只是摆出了正确的口型! - Moose
我刚刚尝试了一下对于一个UserControl,但它并没有起作用;得到了null。也许有些控件实际上会将MouseEventArgs传递给处理程序,但您不应该依赖于此,至少要进行非空检查,未来的版本可能会破坏这种行为。对于哪些控件有效? - Daniel Brückner
我错过了“控件的双击”...我在窗体上进行操作。我会编辑这个以反映我的错误。谢谢提醒。 - Moose

6

Control.MousePosition和Control.MouseButtons是您要查找的内容。使用Control.PointToClient()和Control.PointToScreen()在屏幕坐标和控件相对坐标之间进行转换。

有关详细信息,请参见MSDN Control.MouseButtons PropertyControl.MousePosition PropertyControl.PointToClient MethodControl.PointToScreen Method


更新

不要被细节迷惑了... :D 请查看Moose的回答并查看事件参数。

这篇MSDN文章列出了哪些鼠标动作会触发控件中的哪些事件。

更新

我错过了Moose的转换,所以这个方法行不通。您必须从Control.DoubleClick()内部使用静态Control属性。因为按钮信息被编码为位字段,所以您必须按照以下方式进行测试,使用所需的按钮。

(Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left

如何使用 Control.MouseButtons 确定哪个按钮被按下?它包含要进行比较的常数,但除此之外,我不知道该如何使用它。DoubleClickEventArgs 中没有一个变量可以与此进行比较。 - user79755
danbruc,谢谢您的提醒!我已经编辑了我的帖子以反映您的信息。 - Moose
你的回答更好:在紧凑框架中没有MouseDoubleClick事件,但是你的方法很好。 - Soonts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接