【发布时间】:2013-06-03 22:41:27
【问题描述】:
我一直在使用 xna Mouse 类,我能够让鼠标每帧移动的唯一方法是每次将鼠标重置到屏幕中心,然后在放回之前测量位移到中心。这看起来非常骇人听闻,而且我的鼠标支持 5700dpi 的分辨率,当 xna 返回屏幕位置的整数时,我肯定不会得到。
【问题讨论】:
-
不,这正是我不想要的......
我一直在使用 xna Mouse 类,我能够让鼠标每帧移动的唯一方法是每次将鼠标重置到屏幕中心,然后在放回之前测量位移到中心。这看起来非常骇人听闻,而且我的鼠标支持 5700dpi 的分辨率,当 xna 返回屏幕位置的整数时,我肯定不会得到。
【问题讨论】:
如果使用 Mouse.SetPosition 并且测量偏移量对您不起作用,您将需要使用 XNA 以外的 API。
您要使用的 API 是 WM_INPUT。 这是您可以通过挂钩消息循环来接收的消息。 (注意:XNA 的 API 等价于WM_MOUSEMOVE,所以不要使用它。)
This MSDN page 提供了有关 API 选择的一些介绍性细节,并提供了一些用于鼠标输入的示例代码(C++ 中)。
如果您不熟悉 Windows 消息循环,不妨从 Wikipedia 开始。它本质上是一个原生 (C/C++) API,因此您必须做一些工作才能从 C# 中使用它。
我自己没有任何方便的代码来执行此操作,但 here is a link 给某人挂钩消息循环以便他们可以处理 WM_CHAR,这可能是一个很好的起点。
【讨论】:
我最近自己放弃了 MouseMove 怪物,发现这很有帮助。然而,似乎 SharpDX 已经将大部分内容包含在其RawInput 模块中,所以这对我来说已经足够了。除此之外,可以通过覆盖WndProc 来挂钩 Windows.System.Forms 的消息循环; WM_INPUT 是消息 id 0x00FF;在 .NET 中声明联合体很棘手,需要 [StructLayout] 属性。
【讨论】: