![]() |
|
|
![]()
|
|
| lonfort |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2014 Репутация: нет Всего: нет |
Всем доброго времени суток!
Задача стоит следующая: выполнить свой код по нажатию кнопки в окне чужого приложения, назовем его калькулятор. Язык: Qt 5, но ввиду вероятного применения WinAPI варианты на Delphi и C/C++ также подходят. ОС: Windows В процессе обдумывания родились два решения: 1) Поставить с помощью dll глобальный хук на нажатия кнопок мыши в окне калькулятора. Выделить в окне прямоугольную область, в которую попадает нужная нам кнопка. При щелчке мыши проверять координаты указателя на попадание в эту область и в случае успеха выполнить свой код. 2) Как-то найти нужную нам кнопку, подменить оконную процедуру кнопки на свою (сабклассинг), с помощью dll внедрить (VirtualAllocEx, CreateRemoteThread) свой код в адресное пространство процесса калькулятора, который будет выполняться при нажатии кнопки. Первый способ, конечно, костыльный. Но размеры окна меняться не будут, это известно, поэтому надо будет только учитывать возможные положения на экране. Второй способ более джедайский, но по итогам гугления в голове только образовалась каша из WinAPI, dll и прочего без понимания правильной последовательности действия. Что посоветуете по написанному, и также помимо этих решений? Спасибо. |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
||||
|
||||
| lonfort |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2014 Репутация: нет Всего: нет |
На самом деле это кнопка из Word 2003, необходимо сделать кастомные кнопки, которые будут запускать внешние приложения (сканирование, печать, калькулятор) или мой код. VBA и макросы использовать нельзя. Новую кнопку в Word добавить несложно, но с помощью WinSpy++ и аналогов я нашел только хэндлы для менюбаров, отдельные кнопки никак не проявляются. Значит ли это, что сабклассинг никак не поможет? |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
Не поможет, у тебя нет хэндла на кнопку, так как она с точки зрения системы не существуют. Их (кнопки) рисует само приложение и само же обрабатывает ввод.
|
|||
|
||||
| lonfort |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2014 Репутация: нет Всего: нет |
Хорошо, возьмем тогда существующий хэндл для менюбара, но получается делать dll-иньекцию в чужой процесс все равно нужно? Никак не могу сообразить правильную последовательность действий для этого случая. |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
Да. Только что тебе даст этот хэндл?
|
|||
|
||||
| lonfort |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2014 Репутация: нет Всего: нет |
Назначу этой кнопке новую оконную процедуру с помощью SetWindowLongPtr, свою собственную, которая будет реагировать на клик мыши. Из нее и будет запускаться нужный код. Я слишком оптимист?) |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
У тебя нет хэндла на саму кнопку, а есть хэндл на контейнер-окно, которое их рисует. Как ты выяснишь по какой именно кнопке был клик? К тому же действие может быть вызвано не только кликом мыши, а еще и с клавиатуры.
|
|||
|
||||
| lonfort |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 30.7.2014 Репутация: нет Всего: нет |
Ок, добавлю свой менюбар с одной кнопкой, или вообще без нее, он сам будет выполнять роль этакой кнопки. Мне бы кто подсказал последовательность действий, я вижу так: 1) Делаем dll-injection в процесс Word, после чего можем выполнять свой код в этом процессе 2) Находим нужный менюбар (по имени или по классу), подменяем оконную процедуру на свою Какая связь между этими пунктами? Или как раз в результате иньекции я и смогу подменить оконную процедуру? |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: 7 Всего: 17 |
По поводу самой инъекции, увы, ничего подсказать не смогу. Спроси в соседнем разделе по WinAPI.
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |