@Laborant666

Как имитировать нажатие мыши в неактивном приложении?

В личных целях поставил себе задачу научиться кликать в любом приложении программно. Например, часто нужно работать в нескольких связанных приложениях и что б их открыть и открыть в них нужные разделы или пункты - нужна имитация кликов. Попытался сымитировать ввод текста в блокноте - вышло через SendMessage, дочернее окно Edit нашел легко. Но потом захотелось научиться нарисовать линию в пейнте тем же способом, будто провел линию мышью - и вот тут столкнулся с проблемой - ввод текста срабатывает, а ввод с мыши не срабатывает. Даже кликнуть нигде не получается, ни один пиксель не рисуется посредством имитации нажатия мыши в окне. mouse_event не подходит, ибо с ним надо двигать курсор и что б окно приложения было активным и поверх всех окон, а хочется сделать обратное - окно перекрыто другим окном, но клик что б проходил. Так же пытался отправлять клики в другие приложения и через SendInput, PostMessage - тщетно. Прошу помощи у вас
  • Вопрос задан
  • 817 просмотров
Решения вопроса 1
@Laborant666 Автор вопроса
Приложения в Windows состоят не из одного окна, а из нескольких. И сообщения надо отправлять не в любое окно приложения, а в конкретное

HWND hPaint = ::FindWindow(nullptr, L"Безымянный - Paint");
HWND hWnd1 = ::FindWindowEx(hPaint, NULL, L"MSPaintView", nullptr);
HWND hWnd2 = ::FindWindowEx(hWnd1, NULL, L"Afx:00007FF72D900000:8", nullptr);


SendMessage(hWnd2, WM_LBUTTONDOWN, 0, MAKELPARAM(500, 500));

То есть нужно спуститься в самый низ по цепочке дочерних окон. Что б понять какое окно для чего используется берем Spy++ и у него смотрим сообщения всех окон и находим самое глубокое в матрешке, которое получает сообщения. В моем случае сообщения о кликах мышкой принимает окно Afx и это именно та часть, где рисуешь, в Spy легко определить что за окно опцией выделения, если б понадобилось кликнуть по элементу кисти или карандаша - то это уже другое окно, которое также отслеживаем по сообщениям. Сначала самое главное окно - кликнули по кнопке - сообщения выскочили. Лезем в окна внутри первого главного окна, берем самое первое, открываем сообщения - кликаем - сообщений нет - ищем другое окно - если есть - лезем внутрь этого окна и так до самого последнего
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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