wataru
@wataru
Разработчик на С++, экс-олимпиадник.

Как отправить клик мышью в чужое SDL окно не двигая системную мышь через winapi?

Я могу легко "сэмулировать" клик мышью через 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 - клиентские. После этого исправления клики работают, пока мышь в окне (не двигая мышь! ура!). Если же мышь в каком-то другом окне, то события игнорируются. Что-то с фокусом осталось исправить, значит.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
wataru
@wataru Автор вопроса
Разработчик на С++, экс-олимпиадник.
После более пристального ковыряния в spy++ я выяснил, что чужое окно получает WM_MOUSELEAVE после каждого моего SendMessage с WM_MOUSEMOVE или WM_LBUTTONDOWN/UP.

Видимо, оно подписывается у системы на это через TrackMouseEvent.

Это лишнее сообщение все портит и приходит даже если посылать сообщения через SendMessage без задержек.

Похоже, придется ковырятся с dll injection, чтобы перехватывать WM_MOUSELEAVE и игнорировать его.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы