我正在尝试编写一个程序,允许我更直观地在Dota 2中移动相机。在保持空间的同时,它模拟鼠标中键,当光标到达屏幕边框时,它会跳回到中心。使光标居中看起来像这样(简化):
PostMessage(w, WM_KEYUP, VK_MBUTTON, 0);
PostMessage(w, WM_MOUSEMOVE, 0, MAKELPARAM(screenWidth/2, screenHeight/2));
SetCursorPos(screenHeight/2, screenHeight/2)
PostMessage(w, WM_KEYDOWN, VK_MBUTTON, 0);
w
是Dota 2的窗口句柄。问题是,当发生这种情况时,Dota仍然认为按钮已关闭,因此相机会跳转。我通过使用SendInput模拟关键事件而不是直接发送消息来部分工作,但这需要在事件之间暂停10ms,这不是我想要的。有没有办法查看消息是否已被其他进程处理?
答案 0 :(得分:1)
游戏通常使用DirectInput进行鼠标输入,这将为他们提供鼠标按钮的真实状态。 GetAsyncKeyState
也会检查实际的鼠标按钮状态。
如果游戏使用其他鼠标处理机制,您的消息将不会有太多(或任何)效果。
您可以尝试使用SendInput
,这会更改Windows向应用程序报告的一些内部状态。
答案 1 :(得分:0)
SendMessage(和SendMessageTimeout)在其返回值中指示消息是否已被处理。