![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск контрола на чужой форме [D7, XP]
Den © (2011-02-17 11:28:00)Есть приложение Office Communicator от Микрософт, в окне этого приложения есть два поля ввода, мне нужно из своего приложения добавить текст во второе поле. Дошел пока до этого:
var
SearchedWnd : HWND;
EDITCtrl : HWND;
hwnd: DWord;
begin
SearchedWnd := FindWindow(nil, 'Office Communicator');
ShowWindow(SearchedWnd,SW_SHOWNORMAL);
EDITCtrl :=FindWindowEx(SearchedWnd, 0, 'NativeHWNDHost', nil);
SendMessage(EDITCtrl1, WM_SETTEXT, 0, lParam(LPCTSTR('ТЕКСТ')));
Параметр NativeHWNDHost я нашел с помощью Spy++ но это не окно ввода а видимо что-то типа панели на которой оно расположено.
Вот приведу выдержку из spy++:
Окно 00170688 "Office Communicator" CommunicatorMainWindowClass
|__ Окно 000205А8 "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0050616 "" DirectUIHWND
|__ Окно 0003063A "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0004063C "" DirectUIHWND
Я извиняюсь за стиль изложения, только начинаю разбираться с этой темой. По сему вопрос: как всетаки вставить текст в то окно которое мне нужно?
sniknik (2011-02-20 10:29:00) [1]> Достучаться до нужного контрола можно или нет?
ну выясни какой контрол тебе нужен виндовый или "нарисованный", до первого можно до второго нет
и кстати, ИМХО, но смотреть вот этой штукой удобнее чем spy++
http://www.greatis.com/delphicb/windowse/download.html
просто наводишь мышку на нужный элемент и имеешь всю нужную инфу, имя, "кто на ком лежит" и т.д., и сразу видно что если контрол не меняется при переводе с "подложки" на него, то это рисунок.
Den (2011-02-20 07:48:00) [2]Достучаться до нужного контрола можно или нет?
Den (2011-02-18 08:15:00) [3]
> Anatoly Podgoretsky © (17.02.11 16:34) [14]
Верно говорите Анатолий, в Office Communicator класс DirectUIHWND - это почти вся форма на которой расположено не только поле ввода но и другие элементы. Видимо до них не достучаться :(
Anatoly Podgoretsky (2011-02-17 16:34:00) [4]> Den (17.02.2011 13:30:12) [12]
Например в отсутствии окон как таковых.
Den (2011-02-17 13:35:00) [5]может потому что Office Communicator находится не в фокусе и, соответственно, поле ввода тоже когда я кликаю кнопку в своей программе?
Den (2011-02-17 13:30:00) [6]
> clickmaker © (17.02.11 13:18) [11]
Спасибо, до DirectUIHWND достучался, в spy++
Окно 00170688 "Office Communicator" CommunicatorMainWindowClass
|__ Окно 000205А8 "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0050616 "ТЕКСТ"DirectUIHWND
|__ Окно 0003063A "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0004063C "" DirectUIHWND
вроде то что нужно, но сообщение в самом окне не появляется (( Блин полдня уже бьюсь, не получается каменный цветок...
Spy++ других окон для этого приложения не показывает, в чем еще может быть проблема?
clickmaker (2011-02-17 13:18:00) [7]EDITCtrl :=FindWindowEx(SearchedWnd, 0, 'NativeHWNDHost', nil);
EDITCtrl :=FindWindowEx(EDITCtrl, 0, 'DirectUIHWND', nil);
Den (2011-02-17 13:16:00) [8]Я понимаю что по иерархии....я пробовал разные варианты:
EDITCtrl :=FindWindowEx(SearchedWnd, 0, 'NativeHWNDHost', nil);
EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, 'DirectUIHWND', nil);
Возврат - ноль.
CommunicatorMainWindowClass - дед
NativeHWNDHost - родитель
DirectUIHWND - дите
т.е. как я понимаю должно быть что то примерно такое:
EDITCtrl :=FindWindowEx(SearchedWnd, 0, 'CommunicatorMainWindowClass', nil);
EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, 'NativeHWNDHost', nil);
EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, 'DirectUIHWND', nil);
И после посылки сообщения я должен получить то чего хочу....ан нет...
И. Павел (2011-02-17 13:09:00) [9]Нужно идти по иерархии. Нашли "деда" нужного вам окна, начинайте просматривать его дочерние окна в поисках родителя интересующего вас окна.
Кстати - опознавать окна лучше не по z-последовательности (которая, кажется, может в некоторых случаях меняться), а например по координатам, тексту заголовка, имени класса и т.д.
Den (2011-02-17 12:58:00) [10]Хм...интересно. Если я пишу
EDITCtrl :=FindWindowEx(SearchedWnd, 0, 'NativeHWNDHost', nil);
EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, 'NativeHWNDHost', nil);
SendMessage(EDITCtrl1, WM_SETTEXT, 0, lParam(LPCTSTR('ТЕКСТ')));
то в меняется вторая строка (spy++):
было:
Окно 00170688 "Office Communicator" CommunicatorMainWindowClass
|__ Окно 000205А8 "ТЕКСТ"NativeHWNDHost
|__ Окно 0050616 "" DirectUIHWND
|__ Окно 0003063A "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0004063C "" DirectUIHWND
стало:
Окно 00170688 "Office Communicator" CommunicatorMainWindowClass
|__ Окно 000205А8 "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0050616 "" DirectUIHWND
|__ Окно 0003063A "ТЕКСТ"NativeHWNDHost
|__ Окно 0004063C "" DirectUIHWND
А мне как я понимаю надо достучаться до окна DirectUIHWND
Если поставить
EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, 'DirectUIHWND', nil);
возвращает 0
И. Павел (2011-02-17 12:39:00) [11]Ну т.е. чтобы найти второе окно, нужно выполнить: EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, 'NativeHWNDHost', nil);
И. Павел (2011-02-17 12:39:00) [12]> Прошу извинить за тупость как найти второе? ))
Второй параметр функции FindWindowEx - это дескриптор дочернего окна. Функция вернет дочернее окно, следующее сразу за тем, что передано во втором аргументе.
Хотя лучше использовать EnumWindows(). Это позволит, например, избежать возможных зацикливаний и ошибок, связанных с удалением окон.
Den (2011-02-17 12:28:00) [13]
> clickmaker © (17.02.11 11:33) [4]
Я немного не соображу, допустим нашел первое:
EDITCtrl :=FindWindowEx(SearchedWnd, 0, 'NativeHWNDHost', nil);
Прошу извинить за тупость как найти второе? ))
clickmaker (2011-02-17 11:33:00) [14]> как всетаки вставить текст в то окно которое мне нужно?
FindWindowEx, пока не найдешь нужное, потом WM_SETTEXT
Den (2011-02-17 11:31:00) [15]сорри за дубль
Den (2011-02-17 11:30:00) [16]Да забыл, исполнение вышеприведенного кода меняет вот что: (из spy++)
Окно 00170688 "Office Communicator" CommunicatorMainWindowClass
|__ Окно 000205А8 "ТЕКСТ" NativeHWNDHost
|__ Окно 0050616 "" DirectUIHWND
|__ Окно 0003063A "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0004063C "" DirectUIHWND
Den (2011-02-17 11:30:00) [17]Удалено модератором