Russian Qt Forum

Qt => Общие вопросы => Тема начата: lonfort от Июль 30, 2014, 16:04



Название: Перехват нажатия кнопки в окне другого приложения
Отправлено: lonfort от Июль 30, 2014, 16:04
Всем доброго времени суток!

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

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

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

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

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

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

Спасибо.


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


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


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