Я пытаюсь написать программу, которая позволяет мне перемещать камеру в 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 вместо прямой отправки сообщений, но для этого требовалась пауза в 10 мс между событиями, а это не то, что я хочу. Есть ли способ узнать, было ли сообщение обработано другим процессом?
Игры обычно используют DirectInput для ввода мышью, что даст им истинное состояние кнопки мыши. GetAsyncKeyState
также проверит фактическое состояние кнопки мыши.
Ваши сообщения не будут иметь большого (или какого-либо) эффекта, если игра использует другие механизмы обработки мыши.
Вы можете попробовать использовать SendInput
вместо этого, который изменяет некоторые внутренние состояния, которые Windows сообщает приложениям.
SendMessage (и SendMessageTimeout) указывают в своем возвращаемом значении, было ли сообщение обработано или нет.