Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

получить hwnd контрола

65K
23 января 2011 года
razguliay
6 / / 23.01.2011
Здравствуйте,

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

в целом, у меня задача вствить текст в тектбокс стороннего приложения, и для этого я получаю хэндл контрола для вставки....

в общем, getfocus не работает для некоторого приложения. как эту проблему можно решить? возможно есть какая-то другая функция для этой цели?

заранее спасибо.
11
23 января 2011 года
oxotnik333
2.9K / / 03.08.2007
попробуй от главного окна получить дочерних: EnumChildWindows
если ничего не найдет - тоды ой
65K
23 января 2011 года
razguliay
6 / / 23.01.2011
контрол на форме считается дочерним окном? сорри если глупый вопрос, просто я winAPI использую постольку-поскольку...
7
23 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Да,любой элемент управления на форме дочерен.Даже сами окна,по сути,дочерни по отношению к рабочему столу
65K
23 января 2011 года
razguliay
6 / / 23.01.2011
тогда утилита типа SPY++ должна показать все окна (в смысле контролы тоже) которые можно найти с помощью enumChildWindows, правильно или не факт?
278
23 января 2011 года
Alexander92
1.1K / / 04.08.2008
Если не ошибаюсь, Spy++ как раз через EnumChildWindows() и ищет. :) Только вдобавок к этому еще и рекурсивно.
65K
23 января 2011 года
razguliay
6 / / 23.01.2011
в общем, не получается таким способом найти нужный контрол...
есть варианты как вставить нужный мне текст в ненативный тектсбокс стороннего java-приложения не зная его хвнд? причем текст для вставки постоянно обновляется... это сделать можно, но пока непонятно как...
278
23 января 2011 года
Alexander92
1.1K / / 04.08.2008
Если этот текстбокс представляет собой отдельное окно - то можно, независимо от того, это нативный текстбокс или нет. Вы, когда использовали EnumChildWindows(), учли, что это окно может быть не на первом уровне вложенности?
65K
23 января 2011 года
razguliay
6 / / 23.01.2011
в этой форме вообще нет дочерних окон, там всё нарисованное джавой(((
диагноз - надо копаться непосредственно в памяти и там менять...
19K
25 января 2011 года
Alegun
269 / / 10.09.2010
Цитата: razguliay

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


Не понимая ничегошеньки в Джаве, всё же рискну предложить вариант, который я использовал в похожей, но правда, в Делфийской сборке: попытки передавать некоторый текст в другие приложения системы с помощью различных эйпиа`шных функций частично привели к провалу - в Блокнот ещё это делать удавалось, а например, в Ворд (хендлы окошек спрятаны вложением ядром офиса) уже ни как. Встал вопрос - что делать? Получился немного кривоватый, но всё таки рабочий способ - использовать буфер обмена оськи. Сначало копируется нужный текст в буфер (надо предусмотреть сохранение, а после и возврат его содержимого), затем устанавливается фокус нужному текстбоксу и вставляется текст из буфера. Можно это делать и виртуально, "без рук". Для примера, данная процедура программно "нажимает" на Ctrl и V, т.е. производит вставку текста из буфера обмена Виндовс:

 
Код:
procedure CtrlV;
 begin
 keybd_event(VK_CONTROL, 0,KEYEVENTF_EXTENDEDKEY, 0);//нажимаем
 keybd_event(86,0,KEYEVENTF_EXTENDEDKEY, 0);
 keybd_event(VK_CONTROL, 0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);//отпускаем
 keybd_event(86,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); inc(YetEvent);
 end;
Наверное и в Джаве есть функция, подобная keybd_event (нужно в архивах форума поглядеть) может получится её задействовать?
Единственный минус - фокус на компоненте должен быть всегда, при его потере, это работать не будет. Мне это было не нужно, так что как отследить и удержать фокус, к сожалению, не знаю.
10
25 января 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: Alegun
процедура программно "нажимает" на Ctrl и V, т.е. производит вставку текста из буфера обмена Виндовс


Функция keybd_event -- устаравший и ненадёжный способ в Windows. Как правильно подсказал в своё время koodeer, лучше пользоваться SendInput-ом, и тогда даже буфер обмена поганить не придётся.

Непосредственно по теме. Давным-давно читал в интернетах, что какая-то оконная библиотека Java (Swing?) всё рисует сама. Соответственно, виндовых control-ов в ней не может быть по определению. Пусть Zorkus скажет.

Аналогичным образом рисуется TLabel в VCL -- у него тоже нет декриптора окна (handle).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог