Я могу легко "сэмулировать" клик мышью через
mouse_event или через
SendInput.
Но оба этих метода требуют, чтобы обманываемое окно было foreground, и двигают системную мышь.
Теоретически же в windows все происходит через события.
Поэтому по идее можно отправить в окно событие движения, клика мыши, но это не работает почему-то.
Искомое окно использует SDL и судя по
исходникам - оно таки слушает системные события (и WM_MOUSEMOVE
тоже).
Судя по всему, проблема в том, что помимо WM_LBUTTONDOWN и подобных - надо отправлять окну еще какие-то события. Я со spy++ из visual studio уже долго ковыряюсь с окном, но пока безуспешно. Пробовал отправлять NCHITTEST, WM_MOUSEMOVE и WM_SETCURSOR перед кликом, но не срабатывает все-равно.
Если руками сдвинуть мышь и отправить только WM_LBUTTONDOWN, то клик срабатывает. Иначе, похоже, окно регистрирует клик не по координатам из WM_LBUTTONDOWN, а откуда-то еще.
Собственно, вопрос - какие события и в каком порядке и какие события правильно отпавлять, чтобы обдурить SDL?
Edit: я изначально накосячил к координатами: в NCHITTEST передаются экранные координаты, а в LBUTTONDOWN и MOUSEMOVE - клиентские. После этого исправления клики работают, пока мышь в окне (не двигая мышь! ура!). Если же мышь в каком-то другом окне, то события игнорируются. Что-то с фокусом осталось исправить, значит.