Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват нажатия кнопки в окне другого приложени 
:(
    Опции темы
lonfort
Дата 30.7.2014, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.7.2014

Репутация: нет
Всего: нет



Всем доброго времени суток!

Задача стоит следующая: выполнить свой код по нажатию кнопки в окне чужого приложения, назовем его калькулятор.
Язык: Qt 5, но ввиду вероятного применения WinAPI варианты на Delphi и C/C++ также подходят.
ОС: Windows

В процессе обдумывания родились два решения:

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

2) Как-то найти нужную нам кнопку, подменить оконную процедуру кнопки на свою (сабклассинг), с помощью dll внедрить (VirtualAllocEx, CreateRemoteThread) свой код в адресное пространство процесса калькулятора, который будет выполняться при нажатии кнопки.

Первый способ, конечно, костыльный. Но размеры окна меняться не будут, это известно, поэтому надо будет только учитывать  возможные положения на экране. Второй способ более джедайский, но по итогам гугления в голове только образовалась каша из WinAPI, dll и прочего без понимания правильной последовательности действия.

Что посоветуете по написанному, и также помимо этих решений?

Спасибо.
PM MAIL   Вверх
Amp
Дата 30.7.2014, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Выяснил бы для начала (например с помощью Spy++) зарегистрирована ли кнопка как окно в системе. Потому что если нет (приложение написано на Qt/WPF/Swing), то все очень грустно.

Цитата(lonfort @  30.7.2014,  19:30 Найти цитируемый пост)
Язык: Qt 5

 smile 

Это сообщение отредактировал(а) Amp - 30.7.2014, 21:13
PM MAIL   Вверх
lonfort
Дата 31.7.2014, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.7.2014

Репутация: нет
Всего: нет



Цитата(Amp @ 30.7.2014,  21:12)
Выяснил бы для начала (например с помощью Spy++) зарегистрирована ли кнопка как окно в системе. Потому что если нет (приложение написано на Qt/WPF/Swing), то все очень грустно.

На самом деле это кнопка из Word 2003, необходимо сделать кастомные кнопки, которые будут запускать внешние приложения (сканирование, печать, калькулятор) или мой код. VBA и макросы использовать нельзя. Новую кнопку в Word добавить несложно, но с помощью WinSpy++ и аналогов я нашел только хэндлы для менюбаров, отдельные кнопки никак не проявляются. Значит ли это, что сабклассинг никак не поможет? 
PM MAIL   Вверх
Amp
Дата 31.7.2014, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Не поможет, у тебя нет хэндла на кнопку, так как она с точки зрения системы не существуют. Их (кнопки) рисует само приложение и само же обрабатывает ввод.
PM MAIL   Вверх
lonfort
Дата 31.7.2014, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.7.2014

Репутация: нет
Всего: нет



Цитата(Amp @ 31.7.2014,  14:39)
Не поможет, у тебя нет хэндла на кнопку, так как она с точки зрения системы не существуют. Их (кнопки) рисует само приложение и само же обрабатывает ввод.

Хорошо, возьмем тогда существующий хэндл для менюбара, но получается делать dll-иньекцию в чужой процесс все равно нужно? Никак не могу сообразить правильную последовательность действий для этого случая.
PM MAIL   Вверх
Amp
Дата 31.7.2014, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Да. Только что тебе даст этот хэндл? 
PM MAIL   Вверх
lonfort
Дата 31.7.2014, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.7.2014

Репутация: нет
Всего: нет



Цитата(Amp @ 31.7.2014,  15:09)
Да. Только что тебе даст этот хэндл?

Назначу этой кнопке новую оконную процедуру с помощью SetWindowLongPtr, свою собственную, которая будет реагировать на клик мыши. Из нее и будет запускаться нужный код. Я слишком оптимист?)
PM MAIL   Вверх
Amp
Дата 31.7.2014, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



У тебя нет хэндла на саму кнопку, а есть хэндл на контейнер-окно, которое их рисует. Как ты выяснишь по какой именно кнопке был клик? К тому же действие может быть вызвано не только кликом мыши, а еще и с клавиатуры.
PM MAIL   Вверх
lonfort
Дата 2.8.2014, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 30.7.2014

Репутация: нет
Всего: нет



Цитата(Amp @ 31.7.2014,  16:37)
У тебя нет хэндла на саму кнопку, а есть хэндл на контейнер-окно, которое их рисует. Как ты выяснишь по какой именно кнопке был клик? К тому же действие может быть вызвано не только кликом мыши, а еще и с клавиатуры.

Ок, добавлю свой менюбар с одной кнопкой, или вообще без нее, он сам будет выполнять роль этакой кнопки. Мне бы кто подсказал последовательность действий, я вижу так:

1) Делаем dll-injection в процесс Word, после чего можем выполнять свой код в этом процессе
2) Находим нужный менюбар (по имени или по классу), подменяем оконную процедуру на свою

Какая связь между этими пунктами? Или как раз в результате иньекции я и смогу подменить оконную процедуру?
PM MAIL   Вверх
Amp
Дата 4.8.2014, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



По поводу самой инъекции, увы, ничего подсказать не смогу. Спроси в соседнем разделе по WinAPI.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.