1

我搜索了,但大多数帖子只是告诉我我已经拥有什么,所以下面基本上是我现在的代码:

DIKeyboard->Acquire();
DIMouse->Acquire();

DIMouse->GetDeviceState(sizeof(DIMOUSESTATE), &mouseCurrState);

DIKeyboard->GetDeviceState(sizeof(keyboardState),(LPVOID)&keyboardState);

MousePos.x += mouseCurrState.lX;
MousePos.y += mouseCurrState.lY;

任何告诉我如何获得绝对位置的帖子都只是说使用最后两行。但是我的程序是窗口化的,鼠标可以在屏幕上的任何地方启动。

即如果我的鼠标碰巧在我的屏幕中央,它就变成了位置 0,0。我基本上只是希望我的窗口(不是我的屏幕)的左上角是我的 0,0 鼠标坐标,但是我很难找到任何相关的东西。

谢谢你的帮助!:)

4

1 回答 1

0

在评论中的讨论之后,您必须决定哪种方法最适合您。不幸的是,我从未使用过 DirectInput,所以我不知道它的来龙去脉。

但是,窗口消息最适合 RTS 样式的控件,其中光标被绘制到屏幕上。这是因为它尊重用户设置,例如鼠标加速度和鼠标速度,而 DirectInput 仅使用驱动程序设置(而不是控制面板设置)。用户会期望鼠标感觉相同,尤其是在窗口模式下。

DirectInput 更适用于 FPS 样式的控件,当没有绘制光标时,因为窗口消息只为您提供光标坐标,而不是偏移值。这意味着一旦您位于屏幕边缘,窗口消息将不再允许您检测到鼠标进一步移动(实际上,我对此不是 100% 确定,所以如果有人可以验证,请随时发表评论)。

对于键盘,我肯定会推荐窗口消息,因为 DirectInput 没有任何优势,而且 WM 输入更容易使用,而且功能强大(WM_KEYDOWN 消息包含很多有用的数据),它会让你(通过TranslateMessage)得到良好的文本输入,调整到语言环境等)。

使用 DirectInput 解决您的问题:


您可能可以使用GetCursorPos后跟ScreenToClient来初始化您的MousePos结构。我猜你每次丢失鼠标输入并重新获取它时都需要重做。

混合解决方案(用于类似 RTS 的控件):


如果您需要类似 RTS 的控件,则可以为鼠标使用混合解决方案。如果是这种情况,我建议,虽然我没有测试过,但是使用 WM 来移动鼠标,这样就不需要上面提到的解决方法,并且只使用 DirectInput 来检测额外的鼠标按钮。

现在,我认为您应该在这种混合方法中做的一件事是,当您通过 DirectInput 检测到按钮时,不要直接使用按钮,而是将自定义应用程序消息发布到您自己的消息队列(使用PostMessageand WM_APP)以及相关信息。我建议这样做,因为使用 WM 您不会获得鼠标和键盘的实时状态,而是获得消息时的状态。发布按钮被按下的消息允许您以相同的状态相关方式处理额外的按钮(我不知道这种“滞后”效果有多明显)。它还使整个输入处理非常统一,因为每个输入都作为窗口消息输入。

于 2014-05-23T19:59:43.260 回答