Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Передача текста другому приложению


Автор: AndreyZ53 26.10.2016, 15:46
Здравствуйте!
Есть задача, необходимо передать текст в другое приложение. В общем надо заполнить форму ввода логина и пароля в сторонней программе. То есть, сначала надо вставить логин в поле логин, а затем вставить пароль в поле пароль (перед этим TAB-ом необходимо перейти на поле).

Все хорошо вроде бы у меня получается через SendMessage, в блокноте все отлично работает во всех Windows окнах, но вот как только дело доходит до приложения, написанного на Java, то все, ничего не происходит.
в Панеле управления имеется пункт Java, так вот открываю его делаю активным какое-нибудь текстовое поле и ничего не происходит, а вот в блокноте том же самом все замечательно.

Может кто подскажет, как реализовать, мне без разницы: эмуляция нажатия клавиши, вставка из буфера, главное чтобы проблема решалась хоть как

Автор: kami 28.10.2016, 20:33
в отличие от "православных" виндовых приложений, java -приложение не имеет ничего типа контролов-полей ввода и т.п. По сути java-приложение это одно окно (общее) а всё остальное (включая поля ввода) - просто нарисованная на нем картинка. Поэтому SendMessage вряд ли сработает. Попробуйте использовать более низкоуровневый https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396.

Автор: AndreyZ53 31.10.2016, 13:27
kami, Спасибо за помощь

Проблему решил при помощи эмуляции нажатия клавиш, при помощи процедуры keybd_event

С Java-приложениями только так, поэтому кто будет ломать голову, то делайте сразу эмуляцию нажатия клавиш, как сказал товарищ kami, у приложении Java нет контролов, одно главное окно, это можно посмотреть, например при помощи Microsoft Spy++ и сравнить приложение Java и тот же Блокнот.

Автор: kami 4.11.2016, 23:18
Цитата(AndreyZ53 @  31.10.2016,  13:27 Найти цитируемый пост)
при помощи процедуры keybd_event

Зря. Она устарела и не рекомендуется к использованию. Ее заменила как раз рекомендованная вам SendInput.

Автор: Poseidon 8.11.2016, 10:26
Цитата(kami @  28.10.2016,  20:33 Найти цитируемый пост)
java -приложение не имеет ничего типа контролов-полей ввода и т.п. По сути java-приложение это одно окно (общее) а всё остальное (включая поля ввода) - просто нарисованная на нем картинка. 
kami, я чисто для себя, любопытно просто, как тогда java -приложение разруливает в какую часть этой картинки необходимо писать текст?

Автор: kami 8.11.2016, 22:41
Цитата(Poseidon @  8.11.2016,  10:26 Найти цитируемый пост)
 как тогда java -приложение разруливает в какую часть этой картинки необходимо писать текст? 

Так же, как в Delphi это делается на фреймворке FMX, он же FireMonkey. То же самое - все стилизованные контролы это просто рисунки на канве самой формы. При работе под Windows - все сообщения получает сама форма (больше их и получать некому - ни у кого виндового хендла нет), а дальше транслирует их (преобразованные во "внутренние" платформонезависимые структуры) в нужный объект. Транслированное сообщение доходит до (в терминах FireMonkey) TEdit, а он уже вызывает платфорозависимую DrawTextW с учетом своих координат, ширины/высоты, TFont и т.п.. В общем и целом - внутри приложения объекты, реализующие внешний вид и поведение кнопок/полей ввода, etc, есть. А с точки зрения ОС - есть только один визуальный объект - сама форма.

Ну а теперь честно - не вникал, посему толком не знаю. Но (основываясь на том, что знаю из FMX) - там очень широко используются функции а-ля ControlAtPos(x,y), GetNextTabControl - "типа у кого следующий TabOrder", GetActiveControl с учетом всяческих (тоже самостоятельно реализованных) ZOrder, Visible, Enabled и т.п. При нормальной реализации - действует практически не хуже нативных контролов (понятно, что с ограничениями). К примеру для TMemo в FMX "нормально" стало только с XE8.

Автор: Poseidon 11.11.2016, 18:04
Цитата(kami @  8.11.2016,  22:41 Найти цитируемый пост)
При работе под Windows - все сообщения получает сама форма (больше их и получать некому - ни у кого виндового хендла нет), а дальше транслирует их (преобразованные во "внутренние" платформонезависимые структуры) в нужный объект.

Это все понятно, но ведь при получении Win-сообщения окном Java (и FireMonkey) знают же по каким координатам и что писать. Это явно передается в сообщении. Почему бы не сэмулировать подобное сообщение и не "сказать" Java, что "вот в твоем окне вот по таким вот координатам надо написать вот это". Windows же это как-то делает, и делает это явно через WinMessages.

Автор: kami 11.11.2016, 21:28
Цитата(Poseidon @  11.11.2016,  18:04 Найти цитируемый пост)
Это явно передается в сообщении. Почему бы не сэмулировать подобное сообщение и не "сказать" Java, что "вот в твоем окне вот по таким вот координатам надо написать вот это"

Вообще-то да... Послать WM_KEYXXX  ума много не надо smile Но, мы же не видим код автора, может он просто не то окно нашел... Лень экспериментировать, отошел я от winapi в последнее время...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)