Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];
ВнизПоиск контрола на чужой форме Найти похожие ветки
← →
Den (2011-02-17 11:28) [0]Есть приложение 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
Я извиняюсь за стиль изложения, только начинаю разбираться с этой темой. По сему вопрос: как всетаки вставить текст в то окно которое мне нужно?
← →
Den (2011-02-17 11:30) [1]Да забыл, исполнение вышеприведенного кода меняет вот что: (из spy++)
Окно 00170688 "Office Communicator" CommunicatorMainWindowClass
|__ Окно 000205А8 "ТЕКСТ" NativeHWNDHost
|__ Окно 0050616 "" DirectUIHWND
|__ Окно 0003063A "DUIBaseHWNDHost" NativeHWNDHost
|__ Окно 0004063C "" DirectUIHWND
← →
Den (2011-02-17 11:30) [2]Удалено модератором
← →
Den (2011-02-17 11:31) [3]сорри за дубль
← →
clickmaker © (2011-02-17 11:33) [4]> как всетаки вставить текст в то окно которое мне нужно?
FindWindowEx, пока не найдешь нужное, потом WM_SETTEXT
← →
Den (2011-02-17 12:28) [5]
> clickmaker © (17.02.11 11:33) [4]
Я немного не соображу, допустим нашел первое:
EDITCtrl :=FindWindowEx(SearchedWnd, 0, "NativeHWNDHost", nil);
Прошу извинить за тупость как найти второе? ))
← →
И. Павел © (2011-02-17 12:39) [6]> Прошу извинить за тупость как найти второе? ))
Второй параметр функции FindWindowEx - это дескриптор дочернего окна. Функция вернет дочернее окно, следующее сразу за тем, что передано во втором аргументе.
Хотя лучше использовать EnumWindows(). Это позволит, например, избежать возможных зацикливаний и ошибок, связанных с удалением окон.
← →
И. Павел © (2011-02-17 12:39) [7]Ну т.е. чтобы найти второе окно, нужно выполнить: EDITCtrl :=FindWindowEx(SearchedWnd, EDITCtrl, "NativeHWNDHost", nil);
← →
Den (2011-02-17 12:58) [8]Хм...интересно. Если я пишу
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 13:09) [9]Нужно идти по иерархии. Нашли "деда" нужного вам окна, начинайте просматривать его дочерние окна в поисках родителя интересующего вас окна.
Кстати - опознавать окна лучше не по z-последовательности (которая, кажется, может в некоторых случаях меняться), а например по координатам, тексту заголовка, имени класса и т.д.
← →
Den (2011-02-17 13:16) [10]Я понимаю что по иерархии....я пробовал разные варианты:
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);
И после посылки сообщения я должен получить то чего хочу....ан нет...
← →
clickmaker © (2011-02-17 13:18) [11]EDITCtrl :=FindWindowEx(SearchedWnd, 0, "NativeHWNDHost", nil);
EDITCtrl :=FindWindowEx(EDITCtrl, 0, "DirectUIHWND", nil);
← →
Den (2011-02-17 13:30) [12]
> 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++ других окон для этого приложения не показывает, в чем еще может быть проблема?
← →
Den (2011-02-17 13:35) [13]может потому что Office Communicator находится не в фокусе и, соответственно, поле ввода тоже когда я кликаю кнопку в своей программе?
← →
Anatoly Podgoretsky © (2011-02-17 16:34) [14]> Den (17.02.2011 13:30:12) [12]
Например в отсутствии окон как таковых.
← →
Den (2011-02-18 08:15) [15]
> Anatoly Podgoretsky © (17.02.11 16:34) [14]
Верно говорите Анатолий, в Office Communicator класс DirectUIHWND - это почти вся форма на которой расположено не только поле ввода но и другие элементы. Видимо до них не достучаться :(
← →
Den (2011-02-20 07:48) [16]Достучаться до нужного контрола можно или нет?
← →
sniknik © (2011-02-20 10:29) [17]> Достучаться до нужного контрола можно или нет?
ну выясни какой контрол тебе нужен виндовый или "нарисованный", до первого можно до второго нет
и кстати, ИМХО, но смотреть вот этой штукой удобнее чем spy++
http://www.greatis.com/delphicb/windowse/download.html
просто наводишь мышку на нужный элемент и имеешь всю нужную инфу, имя, "кто на ком лежит" и т.д., и сразу видно что если контрол не меняется при переводе с "подложки" на него, то это рисунок.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c