Почему мои фальшивые нажатия кнопок не работают с SendMessage? - PullRequest
2 голосов
/ 25 июня 2011

Я пытаюсь отправить события мыши в окно в Windows с помощью метода SendMessage(..).

Проблема, с которой я сталкиваюсь, заключается в том, что сообщения не доставляются в окно, в которое я их отправляю, даже если SendMessage возвращает 0, что (согласно документации) означает сообщение был успешно доставлен.

Я использую следующий фрагмент кода:

(Пусть p будет Point структурой и selectedWindow.Handle допустимым дескриптором окна)

int position = ((p.X & 0xFFFF) << 16) | (p.Y & 0xFFFF);

SendMessage(selectedWindow.Handle, 0x0201, new IntPtr(), new IntPtr(position));
SendMessage(selectedWindow.Handle, 0x0202, new IntPtr(), new IntPtr(position));

0x0201 и 0x0202 являются WM_LBUTTONDOWN и WM_LBUTTONUP.

Может ли кто-нибудь просветить меня, почему это не работает?

(Изменить: I am с использованием метода ScreenToClient() для преобразования позиции экрана в позицию в окне)

Ответы [ 2 ]

4 голосов
/ 25 июня 2011

Сообщения мыши обычно извлекаются из очереди сообщений, что означает, что вы должны использовать PostMessage ().Но маловероятно, что это реальная проблема, очень немногие программы обрабатывают мышь в цикле сообщений.UAC - это очевидный сценарий сбоя, вы не можете отправлять сообщения в окно, принадлежащее программе с повышенными правами.Вы отправили неправильное значение WParam, которое может иметь эффект.И, конечно, у вас может быть неправильный дескриптор окна.

Но гораздо более вероятной причиной является код, который мы не видим.Похоже, у вас возникли проблемы с созданием X- и Y-координат сообщения.Никаких таких усилий не требуется, не имеет значения , где вы нажимаете кнопку.Вы также можете щелкнуть по нему в (1, 1):

 PostMessage(selectedWindow.Handle, 0x0201, new IntPtr(1), new IntPtr(0x10001));
 PostMessage(selectedWindow.Handle, 0x0202, new IntPtr(0), new IntPtr(0x10001));

Или другими словами, координаты мыши относительно левого верхнего угла окна.Дополнительные хаки генерируют сообщение BM_CLICK и любое сообщение WM_COMMAND, которое генерирует кнопка.

Используйте инструмент Spy ++ для наблюдения за обработкой сообщения.

3 голосов
/ 25 июня 2011

У меня есть три предложения:

Сначала убедитесь, что координаты относительно начала клиентской области окна.Если вы используете экранные координаты, вы должны сначала использовать функцию ScreenToClient для их преобразования.

Во-вторых, попробуйте использовать PostMessage вместо SendMessage.Это более близко имитирует реальное поведение Windows.

Наконец, если вы не категорически против перемещения фактического указателя мыши, вам может оказаться проще использовать mouse_event или функцию SendInput.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...