0

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

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

当我在 Visual Studio 中查看变量时,它声称它的类型为int.

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

谢谢!

4

2 回答 2

3

这可能是因为 Windows Forms 基本上是一个围绕 C Windows API 的 .NET 包装器。对于WM_MOUSEMOVE和相关消息(WM_LBUTTONDOWN 等),鼠标坐标在 LPARAM 参数中发送。LPARAM 是 LONG_PTR 的 typedef,在 32 位 Windows 上(仅)又是 long 的 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 位用于鼠标坐标。

于 2011-06-16T21:57:23.147 回答
1

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

PointToClient(Cursor.Position)

Microsoft 可以在他们的 .Net 包装器中轻松做到这一点。他们不这样做可能是有正当理由的,但它似乎对我有用。

于 2015-04-10T19:32:23.907 回答