вожусь уже 4-ю неделю, и на данный момент прямых ответов не нашел.
Что можно было делать 4 недели, если ответ гуглится за 4 секунды? За 4 недели можно было игру дизассемблировать и посмотреть, как там всё устроено.
Способов обработки ввода как минимум несколько. На одном Window Message Loop Legacy Input, который ты насилуешь, свет клином не сошёлся. Он никогда не считался подходящим для игр и точного ввода, почему им пользуется огромное количество игр — загадка. Либо банальная человеческая лень.
Есть DirectInput, есть XInput, есть window message loop input events, есть RawInput, и GameInput. Первые два давно уже устаревшими помечены, не развиваются с 2000-х и не рекомендуются к использованию в современных играх.
Устаревшие ивенты из window message loop, которые ты пытаешься посылать в окно, никогда не рекомендовались для реалтаймовых игр, где важна скорость реакции и точность наведения курсора. Остаётся
RawInput. Ну а
GameInput — слишком новая, высокоуровневая и специфическая штука, чтобы её часто использовали. Более того, все эти *Input базируются на низком уровне как раз на RawInput.
Обрати внимание на ивенты, которые приходят перед нужными тебе.
WM_INPUT, вот он как раз относится к RawInput. Его то и обрабатывает приложение. Сначала приходит WM_INPUT, а потом за ним старое сообщение просто для совместимости с древними хендлерами. Приходят старые сообщения потому, что разработчики не отключили их генерацию флагом
RIDEV_NOLEGACY, либо есть какая-то логика отката к старому обработчику.
И самое главное, WM_INPUT генерируется HID-железкой внутри самого системного хендлера событий. То есть самому послать это сообщение от лица пользователя невозможно.
Эмулировать RawInput можно только аппаратно/драйвером/гипервизором, либо внедрившись в код игры. Придётся реверсить игру и разбираться в логике обработки сообщений. Возможно, можно как-то заабьюзить логику, которая проверяет, будет ли обрабатывать сырой ввод, и вдруг есть какое-то условие или флаг из конфига, при котором произойдёт fallback, который сбросит обработку WM_INPUT на старые ивенты.
PS. С ответа про обработку ввода через графические API поржал :D. Нормальная шутка, смешная.