Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.29;
Скачать: CL | DM;

Вниз

Поиск контрола на чужой форме   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
1-1255882069
aha
2009-10-18 20:07
2011.05.29
Получаю данные ( неполный IEEE формат - 3 байта) , как проще


15-1297832967
Marygold
2011-02-16 08:09
2011.05.29
грид


4-1247595131
Muxa/Ibl4
2009-07-14 22:12
2011.05.29
Последовательный доступ к MMF


15-1297697277
Копир
2011-02-14 18:27
2011.05.29
Давно ждал термина. Оказывется orthorexia!


15-1297355437
bss
2011-02-10 19:30
2011.05.29
Управление и слежением за Word / Excel и другими редакторами