Russian Qt Forum
Ноябрь 24, 2024, 04:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват нажатия кнопки в окне другого приложения  (Прочитано 4194 раз)
lonfort
Гость
« : Июль 30, 2014, 16:04 »

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

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

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

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

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

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

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

Спасибо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июль 31, 2014, 07:36 »

Первый способ костыльный, а второй вполне себе приемлемый, на сколько я помню винапи.
Ищи "убегающая кнопка Пуск". Вот один из примеров http://forum.xakep.ru/m_837345/printable.htm (ищи фразу "Точно так же и с кнoпкой ПУСК.Только ее надо для начало найти.").
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lonfort
Гость
« Ответ #2 : Июль 31, 2014, 15:37 »

Первый способ костыльный, а второй вполне себе приемлемый, на сколько я помню винапи.
Ищи "убегающая кнопка Пуск". Вот один из примеров http://forum.xakep.ru/m_837345/printable.htm (ищи фразу "Точно так же и с кнoпкой ПУСК.Только ее надо для начало найти.").


То есть, если я имею хэндл нужной кнопки, сабклассинга будет достаточно? Или я просто не смогу ничего сделать без dll-иньекции в чужой процесс? Никак не могу осознать нужный алгоритм для второго способа.
И еще вопрос, для некоторых элементов хэндла все-таки нету, значит с ними ничего не сделать уже?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.243 секунд. Запросов: 23.