Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск дочерних окон [D4, Win95/98]


Cobalt ©   (2002-02-09 15:37:00) 

Помогите! Пытаюсь получить хэндл окна рабочего стола, точнее SysListView, который находится на ём, однако получаю какой-то мусор. Т.Е. хэндлы дочерних окон где-то в районе $44ff, тогда как SpyView показывает, что должен быть $11C. Имён классов окон тоже не получаю.

procedure TForm1.FormActivate(Sender: TObject);
var h2:HWND;
begin
h2:=FindWindow("Progman",nil);//То окно, на котором находится эксплореровский ListView.
i:=0;
EnumChildWindows(h2,@EnumDesktop,0);
end;

Function EnumDesktop(h:HWND;l:LParam):Bool;
var
c:PChar;
s:string;
begin
c:=StrAlloc(255);
GetClassName(h,c,255);
s:=strPas(c);
GetWindowText(h,c,255);
s:=s+strPas(c);
Form1.ListBox1.Items.Add(IntToStr(i)+":"+s+":"+IntToHex(H,6));
inc(i);
result:=true;
end;


Cobalt   (2002-02-11 00:40:00) [1]

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1013258264&n=5
2 Raptor © (10.02.02 21:09)
Агромадное спасибо!!!!!!!!
Усё работает!!!!!!!


П.С. Правильно ли я понял, что все функции (не только callback) в Windows - Stdcall?


Raptor   (2002-02-10 21:09:00) [2]

Нда-а. Сразу видно, что человек никогда не работал с энумераторами. :-))
А stdcallгде?!
Короче, обявляешь функцию так
Function EnumDesktop(h:HWND;l:LParam):Bool;stdcall;
Тогда все будет нормально работать.


Cobalt   (2002-02-10 19:45:00) [3]

Хрен с Progman_ом и FindWindow. Дело-то в EnumChildWindows

Глюки при обходе своей же формы!

procedure TForm1.FormActivate(Sender: TObject);
var h2:HWND;
begin
Form1.ListBox1.Items.Add(IntToHex(ListView1.Handle,6));
Form1.ListBox1.Items.Add(IntToHex(ListBox1.Handle,6));
Form1.ListBox1.Items.Add(IntToHex(Button1.Handle,6));

h2:=FindWindow("Progman",nil);
i:=0;
EnumChildWindows(Form1.Handle,@EnumDesktop,i);
ShowMessage(SysErrorMessage(GetLastError));
end;

Function EnumDesktop(h:HWND;l:LParam):Bool;
var c:PChar;
s:string;
begin
c:=StrAlloc(255);
s:=strPas(c);
Form1.ListBox1.Items.Add(IntToStr(l)+" "+IntToStr(i)+":"+s+":"+IntToHex(H,6));
inc(i);
result:=true;
end;


Итак, что получается в рез-те этих действий:
1) Получаю(ручками) хэндлы трёх своих контролов на форме.
2) Получаю какие-то цифры, которые, якобы, являются хэндлами дочерних окон моей формы, однако они все одинаковые (и, естественно, не совпадают с теми,что я получаю от VCL).
3) несовпадает даже lParam , которое является application-defined value to be passed to the callback function.

Что примечательно:
Количество "чисел", которые я получаю в рез-те обхода, такое же, как и количество контролов на форме. z%((((


Raptor   (2002-02-10 00:07:00) [4]

под NT непойдёт!!!!!
Интересно, почему это не пойдет?!


SERGEYSA   (2002-02-09 23:16:00) [5]

FindWindow не ищет дочерние окна, читай API описание

The FindWindowfunction retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

Тебе надо FindWindowEx

The FindWindowEx function retrieves the handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the given child window.

под NT непойдёт!!!!!


Наверх

Титульная страница Поиск, карта сайта Написать письмо