MouseEventArgs.X的类型是什么?

时间:2011-04-22 22:58:56

标签: .net-3.5 types int mousemove eventargs

在Visual Studio 2008(.NET 3.5)中使用C#。展望System.Windows.Forms.MouseEventArgs

当我拦截处理MouseMove事件时,我看到长Panel的奇怪行为。似乎MouseEventArgs.X从0到32767,并且回绕到-32768。

当我在Visual Studio中观察变量时,它声称它的类型为int

显然它是一个16位有符号整数,就像它的行为方式一样。这是真的?这是一个硬限制吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这可能是因为Windows Forms基本上是围绕C Windows API的.NET包装器。对于WM_MOUSEMOVE和相关消息(WM_LBUTTONDOWN等),鼠标坐标在LPARAM参数中发送。 LPARAM是LONG_PTR的typedef,在32位Windows(仅)上反过来又是一个typedef。正如WM_MOUSEMOVE的文档所说,你可以使用GET_X_LPARAM和GET_Y_LPARAM宏来获取光标位置,它们分别返回低阶int和高阶int。

由于该值为32位(在32位Windows上),因此唯一有意义的方法是x和y坐标实际上是16位值。基于windowsx.h中GET_X_LPARAM的定义,我也猜测(但是没有官方消息来说)即使在x64上,只有LPARAM的低32位用于鼠标坐标。

答案 1 :(得分:0)

不使用鼠标移动事件中的位置,而是使用:

PointToClient(Cursor.Position)

Microsoft可以轻松地在他们的.Net包装器中执行此操作。他们可能没有合理的理由,但似乎对我有用。