Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Вниз

Как получить handle s элементов другой программы? 


Romul   (2002-02-14 16:36) [0]

Получаю handle одной своей проги из другой посредством FindWindow, дальше для получения handl"ов всяких кнопок, эдитов и т.д. надо применить FindWindowEx, но не знаю как. Как эти самые хендлы получить и желательно знать кокой хендл какому элементу соответствует.



Fellomena   (2002-02-14 17:06) [1]

Как сам правильно сказал - использовать надо FindWindowEx + знать класс того окна (кнопка тоже окно), которое ты хочешь найти.
Пример:

FindWindowEx(FindWindow("Shell_TrayWnd", nil),0,"Button", nil);

Получили дескриптор кнопки Пуск.
Т.е. в FindWindowEx первым параметром окно-родитель, третьим класс того окна, который ты хочешь найти. Ну а когда handle узнаешь, то определить то это окно или не то, что тебе нужно - не сложно.



Romul   (2002-02-14 17:16) [2]

Т.е. если я укажу "Button" или "Edit" то это будет корректно и будет означать класс окон? А как, например, c DateTimePicker"ом быть?
И как по хендлу определить какой кнопке или Edit"у он пренадлежит? Если можно поподробнее.



Fellomena   (2002-02-14 17:39) [3]

Почитай об оконных классах в Win9x - в SDK есть их названия.

>> И как по хендлу определить какой кнопке или Edit"у он пренадлежит?

Зная дескриптор окна, ты можешь с помощью API ф-ий узнать об этом окне всё. Caption, размер абсолютный, размер относительный, стиль, родителя, и т.д.
И при том ты сам должен знать что ты ищешь - кнопку или Edit - от этого зависит имя класса, которое ты указываешь в FindWindowEx.
8)

Короче, читни SDK или просто посмотри какие данные по окнам выдаёт Spy++ или (как же та прога называется, что вместе с Delphi и Builder-ом поставляется - для просмотра запущенных проессов ?).

Если ничего не получится - будем бороться :)



Romul   (2002-02-14 18:02) [4]

WinSight наверное? Ладно, посмотрю. Но если что я этот вопрос еще подниму :) Уж больно интересная тема. Да и другим наверное интересно будет.



Romul   (2002-02-15 10:56) [5]

Все получилось, только небольшая проблема осталась КАК ПОЛУЧИТЬ ХЕНДЛЫ ВСЕХ, ДОПУСТИМ, ЭДИТОВ (EDIT1, EDIT2,...), ЕСЛИ ОНИ ПУСТЫЕ? Т.е. если мы делаем так FindWindowEx(Hndl, 0, "TEdit", nil); то получим первый попавшийся хендл эдита. Т.е. получается, что если у эдитов в данный момент нет заголовков, то если хоть сто раз написать данный код, то все равно получим одно и тоже, как быть?



Вячеслав   (2002-02-15 12:05) [6]

Находишь главное окно, затем EnumChildWindows-все дочерние, затем дочерние у дочерних и так далее. Посмотри в MSDN, там все есть на эту тему. А примеры можно взять на Королевстве Делфи, статья называется как-то типа "Мечта вуайериста".
P.S. Так и называется, я не шучу :)



Romul   (2002-02-15 13:40) [7]

Ok, буду смотреть статью.



[NIKEL]   (2002-02-15 16:47) [8]

попробуйте вот так...

char buf[65535];
//вот так ты можешь получить handle первого дочернего окна
hwd = GetWindow(здесь Handle окна у которого ты ищешь чилды,GW_HWNDFIRST|GW_CHILD);
while (hwd != 0) // Крутим цикл, пока есть дочерние окна
{
GetClassName(hwd,&buf,255);//получаешь имя класса
if((buf[0] == "E") && (buf[3] == "t"))//это Edit ?
{
... чё нить делаем с этим handle`ом
}
hwd = GetWindow(hwd,GW_HWNDNEXT); // следующее дочернее окно
}


и не надо париться :)




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.017 c
7-57904           МАРАТ                 2002-01-23 09:27  2002.04.18  
термо-принтер


4-57924           alexey1               2002-02-13 04:43  2002.04.18  
open/save dialogs


14-57883          Фэ                    2002-03-04 23:10  2002.04.18  
Shells


1-57757           kalinka               2002-04-05 15:31  2002.04.18  
Как вытащить в Quick Report количество страниц?


6-57834           _Alex_                2002-02-04 16:44  2002.04.18  
как узнать список(hostname) доступных компов в сети