Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1297969851
Criptonik
2011-02-17 22:10
2011.05.29
путь к директории с помощью opendialog


3-1259929546
12
2009-12-04 15:25
2011.05.29
Никто не пробовал свое окно из расширенной процедуры показать?


15-1297334599
Tonick2001
2011-02-10 13:43
2011.05.29
SQL ip to number


15-1297718999
Юрий
2011-02-15 00:29
2011.05.29
С днем рождения ! 15 февраля 2011 вторник


10-1174398087
msgipss
2007-03-20 16:41
2011.05.29
Как оптимизировать чтение excel документа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский