在窗口模式下设置/获取我的绝对鼠标位置

时间:2014-05-22 23:43:45

标签: c++ directinput

我搜索过,但大多数帖子只是告诉我我已经拥有的内容,所以下面基本上就是我的代码:

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鼠标坐标,但我很难找到任何相关的东西。

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

根据评论中的讨论,您必须确定哪种方法最适合您。不幸的是,从未使用过DirectInput,我不知道它的来龙去脉。

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

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

对于键盘,我肯定会建议窗口消息,因为DirectInput没有优势,WM输入更容易使用,而且相当强大(WM_KEYDOWN消息包含许多有用的数据),它会允许你(通过TranslateMessage)获得良好的文本输入,调整为区域设置等。)。

使用DirectInput解决您的问题:


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

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


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

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