| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Перехват нажатия кнопки в окне другого приложени |
| Автор: lonfort 30.7.2014, 19:30 |
| Всем доброго времени суток! Задача стоит следующая: выполнить свой код по нажатию кнопки в окне чужого приложения, назовем его калькулятор. Язык: Qt 5, но ввиду вероятного применения WinAPI варианты на Delphi и C/C++ также подходят. ОС: Windows В процессе обдумывания родились два решения: 1) Поставить с помощью dll глобальный хук на нажатия кнопок мыши в окне калькулятора. Выделить в окне прямоугольную область, в которую попадает нужная нам кнопка. При щелчке мыши проверять координаты указателя на попадание в эту область и в случае успеха выполнить свой код. 2) Как-то найти нужную нам кнопку, подменить оконную процедуру кнопки на свою (сабклассинг), с помощью dll внедрить (VirtualAllocEx, CreateRemoteThread) свой код в адресное пространство процесса калькулятора, который будет выполняться при нажатии кнопки. Первый способ, конечно, костыльный. Но размеры окна меняться не будут, это известно, поэтому надо будет только учитывать возможные положения на экране. Второй способ более джедайский, но по итогам гугления в голове только образовалась каша из WinAPI, dll и прочего без понимания правильной последовательности действия. Что посоветуете по написанному, и также помимо этих решений? Спасибо. |
| Автор: Amp 30.7.2014, 21:12 |
| Выяснил бы для начала (например с помощью Spy++) зарегистрирована ли кнопка как окно в системе. Потому что если нет (приложение написано на Qt/WPF/Swing), то все очень грустно. |
| Автор: lonfort 31.7.2014, 14:25 | ||
На самом деле это кнопка из Word 2003, необходимо сделать кастомные кнопки, которые будут запускать внешние приложения (сканирование, печать, калькулятор) или мой код. VBA и макросы использовать нельзя. Новую кнопку в Word добавить несложно, но с помощью WinSpy++ и аналогов я нашел только хэндлы для менюбаров, отдельные кнопки никак не проявляются. Значит ли это, что сабклассинг никак не поможет? |
| Автор: Amp 31.7.2014, 14:39 |
| Не поможет, у тебя нет хэндла на кнопку, так как она с точки зрения системы не существуют. Их (кнопки) рисует само приложение и само же обрабатывает ввод. |
| Автор: lonfort 31.7.2014, 14:59 | ||
Хорошо, возьмем тогда существующий хэндл для менюбара, но получается делать dll-иньекцию в чужой процесс все равно нужно? Никак не могу сообразить правильную последовательность действий для этого случая. |
| Автор: Amp 31.7.2014, 15:09 |
| Да. Только что тебе даст этот хэндл? |
| Автор: lonfort 31.7.2014, 15:53 | ||
Назначу этой кнопке новую оконную процедуру с помощью SetWindowLongPtr, свою собственную, которая будет реагировать на клик мыши. Из нее и будет запускаться нужный код. Я слишком оптимист?) |
| Автор: Amp 31.7.2014, 16:37 |
| У тебя нет хэндла на саму кнопку, а есть хэндл на контейнер-окно, которое их рисует. Как ты выяснишь по какой именно кнопке был клик? К тому же действие может быть вызвано не только кликом мыши, а еще и с клавиатуры. |
| Автор: lonfort 2.8.2014, 19:02 | ||
Ок, добавлю свой менюбар с одной кнопкой, или вообще без нее, он сам будет выполнять роль этакой кнопки. Мне бы кто подсказал последовательность действий, я вижу так: 1) Делаем dll-injection в процесс Word, после чего можем выполнять свой код в этом процессе 2) Находим нужный менюбар (по имени или по классу), подменяем оконную процедуру на свою Какая связь между этими пунктами? Или как раз в результате иньекции я и смогу подменить оконную процедуру? |
| Автор: Amp 4.8.2014, 11:41 |
| По поводу самой инъекции, увы, ничего подсказать не смогу. Спроси в соседнем разделе по WinAPI. |