我搜索过,但大多数帖子只是告诉我我已经拥有的内容,所以下面基本上就是我的代码:
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鼠标坐标,但我很难找到任何相关的东西。
感谢您的帮助! :)
答案 0 :(得分:0)
根据评论中的讨论,您必须确定哪种方法最适合您。不幸的是,从未使用过DirectInput,我不知道它的来龙去脉。
但是,窗口消息最适合RTS样式的控件,其中光标被绘制到屏幕上。这是因为这涉及用户设置,例如鼠标加速和鼠标速度,而DirectInput仅使用驱动程序设置(因此不使用控制面板设置)。用户会希望鼠标感觉相同,尤其是在窗口模式下。
当没有光标绘制时,DirectInput更适合FPS样式的控件,因为窗口消息只提供光标坐标,而不是偏移值。这意味着一旦您处于屏幕边缘,窗口消息将不再允许您检测到鼠标被进一步移动(实际上,我对此不是100%肯定,所以如果有人可以验证,请随时发表评论)。
对于键盘,我肯定会建议窗口消息,因为DirectInput没有优势,WM输入更容易使用,而且相当强大(WM_KEYDOWN消息包含许多有用的数据),它会允许你(通过TranslateMessage
)获得良好的文本输入,调整为区域设置等。)。
您可以使用GetCursorPos后跟ScreenToClient来初始化MousePos
结构。我猜你每次丢失鼠标输入并重新获取它时都需要重做它。
如果您需要类似RTS的控件,可以使用鼠标的混合解决方案。如果是这种情况,我建议,虽然我没有测试过,但是使用WM来移动鼠标,这样就不需要上面提到的解决方法了,只使用DirectInput来检测其他鼠标按钮。
现在,我认为您应该采用这种混合方法做的一件事是,当您通过DirectInput检测到它时不直接使用该按钮,而是将自定义应用程序消息发布到您自己的消息队列中(使用PostMessage
和{ {1}})及相关信息。我建议这是因为使用WM你不会得到鼠标的实时状态。键盘,而不是消息时的状态。发布按钮被按下的消息允许您以相同的状态依赖方式处理额外按钮(我不知道这种'滞后'效果有多明显)。它还使整个输入处理非常均匀,因为输入的每一位都作为窗口消息输入。