在Visual Studio 2008(.NET 3.5)中使用C#。展望System.Windows.Forms.MouseEventArgs
。
当我拦截处理MouseMove
事件时,我看到长Panel的奇怪行为。似乎MouseEventArgs.X
从0到32767,并且回绕到-32768。
当我在Visual Studio中观察变量时,它声称它的类型为int
。
显然它是一个16位有符号整数,就像它的行为方式一样。这是真的?这是一个硬限制吗?
谢谢!
答案 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包装器中执行此操作。他们可能没有合理的理由,但似乎对我有用。