Russian Qt Forum

Qt => Общие вопросы => Тема начата: Orfus от Декабрь 24, 2010, 00:54



Название: Доступ к информации другого прложения
Отправлено: Orfus от Декабрь 24, 2010, 00:54
Доброго времени суток. Столкнулся с новой для себя проблемой. Раньше никогда подобного не делал, но работающие образцы сделанные на С++ видел.

Имеется приложение А и приложение В. А пишется мной, В написано некоторым другим лицом. На чём оно писалось мне не известно. В приложении В имеется некое текстовое поле. Мне же необходимо чтобы приложение А переодически вытаскивало информацию из текстового поля приложения В.

Вопрос в том возможно ли реализовать такое впринципе и если да, то в каком направлении копать (что читать на эту тему  ;D ) ?
Так же интересует возможно ли из приложения А, по наступлению некоторого события (Timeout у таймера например) нажимать на кнопку в приложении "В"?  ???


Название: Re: Доступ к информация другого прложения
Отправлено: brankovic от Декабрь 24, 2010, 01:17
Вообще-то платформу надо указывать. Постановка не кросс-платформенная, к кьют отношения не имеет.

Под винду можно иногда. Читать на msdn про sendmessage, параметры WM_COMMAND (чтобы кликнуть), WM_GETTEXT (чтобы украсть текст). Идентификаторы окон можно узнать через spy++. Мне точно удавалось кликать и удавалось _выставлять_ текст (под ХР). Но может не сработать, особенно если цель написана на кьют.



Название: Re: Доступ к информация другого прложения
Отправлено: fuCtor от Декабрь 24, 2010, 07:52
Но может не сработать, особенно если цель написана на кьют.

Не может, а не сработает. Т.к. Qt создает только главное окно, все осталольное отрисовывается самостоятельно => нет дискрипторов у элементов.


Название: Re: Доступ к информация другого прложения
Отправлено: ufna от Декабрь 24, 2010, 08:03
Сработает, если знать как подключаться :) Там через .dll идет подступ, через Qt'шные апи.

Сабжевая задача - hook


Название: Re: Доступ к информация другого прложения
Отправлено: break от Декабрь 24, 2010, 11:31
Сработает, если знать как подключаться :) Там через .dll идет подступ, через Qt'шные апи.

Сабжевая задача - hook

А можно по подробнее - какое Qt-шное API доступно нам если мы хотим контактировать с чужим приложением без исходников?


Название: Re: Доступ к информация другого прложения
Отправлено: Igors от Декабрь 24, 2010, 12:02
Ну в общем контактировать надо с тем кто этого контакта хочет  :) Разработчикам A и B несложно договориться - напр. B валит измененное поле в clipboard а то и просто в текстовый файл. А так извлечь можно через WinAPI или dll, но просто жалко потраченного  впустую труда. Плюс вероятно выяснится что нужно не только 1 тестовое поле, а и... Лучше изучить варианты "легализации"  :) 


Название: Re: Доступ к информация другого прложения
Отправлено: Orfus от Декабрь 24, 2010, 13:06
Вообще-то платформу надо указывать. Постановка не кросс-платформенная, к кьют отношения не имеет.
Извиняюсь, под Win на данный момент.
Ну в общем контактировать надо с тем кто этого контакта хочет  :) Разработчикам A и B несложно договориться - напр.
Разработчик В по хорошему не должен знать, что его читают. Полей там вообще говоря будет много как и дочерних окон. Гемор от всего этого осознал на этапе задумки, но всё же решился делать. Просто не знаю, что читать по этой теме. Я так понял надо смотреть в сторону WinAPI. Буду разбиратся.


ЗЫ Пишу не шпионы ;D


Название: Re: Доступ к информация другого прложения
Отправлено: Igors от Декабрь 24, 2010, 13:24
Разработчик В по хорошему не должен знать, что его читают. Полей там вообще говоря будет много как и дочерних окон. Гемор от всего этого осознал на этапе задумки, но всё же решился делать. Просто не знаю, что читать по этой теме. Я так понял надо смотреть в сторону WinAPI. Буду разбиратся.
Ну если так - сочувствую. Сначала смотрите в spy где что. Если нужное поле "окно Вындоуз" - то получается несложно, через FindWindow


Название: Re: Доступ к информация другого прложения
Отправлено: brankovic от Декабрь 24, 2010, 13:28

Я так понял надо смотреть в сторону WinAPI. Буду разбиратся.


SendMessage и FindWindow как раз winapi. Но если окон реально много, то не стоит возни, имхо. Я писал автоматизацию одного диалога -- расставлял параметры, нажимал кнопку generate. Получилось просто, но там вся программа это один диалог.


ЗЫ Пишу не шпионы ;D

меня терзают смутные сомненья..  :-\


Название: Re: Доступ к информации другого прложения
Отправлено: SASA от Декабрь 24, 2010, 14:29
Если писано с использованием Win API, то текст передается в окно через специальное сообщение (аля SetWindowText). Можно поставить хук, который будет отлавливать эти сообщения.
Как уже говорили, нужно потыркать спем(тулза, ставится со студией), чтобы найти отличительные особенности окошка с текстом. Это поможет отфильтровать только те сообщения, которые идут именно этому окну.
Про нажимания - смотри функцию
Код:
VOID mouse_event(
  DWORD dwFlags,
  DWORD dx,
  DWORD dy,
  DWORD dwData,
  DWORD dwExtraInfo
);
Кликает где хочешь и как хочешь :)


Название: Re: Доступ к информации другого прложения
Отправлено: ufna от Декабрь 24, 2010, 18:58
Счас с переходом Full Tilt на Qt тема хуков "в Qt" неимоверно возрасла :) счас с делами разгребусь, на это дело статью сделаю. Хотя на иностранных форумах "по частям" ответ на этот вопрос найти можно.


Название: Re: Доступ к информации другого прложения
Отправлено: fuCtor от Декабрь 25, 2010, 06:48
Хук через подмену dll со своим кодом (для логирования или IPC) в нужных местах (QWidget::event например)?