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




Вниз

Поиск дочерних окон 


Cobalt   (2002-02-09 15:37) [0]

Помогите! Пытаюсь получить хэндл окна рабочего стола, точнее 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;



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

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

The FindWindow function 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 непойдёт!!!!!



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

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



Cobalt   (2002-02-10 19:45) [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 21:09) [4]

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



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

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


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




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




Наверх





Память: 0.73 MB
Время: 0.042 c
14-32958          IronHawk              2002-02-28 18:32  2002.04.11  
Как с помощью одного QuickRep-a сделать 2,3,4 страницы разные ?


14-32952          ShaggyDoc             2002-03-01 11:07  2002.04.11  
www.delphipages.com - это не вымысел?


14-32979          Стас                  2002-03-04 08:32  2002.04.11  
Исходники для работы с dBASE в Паскале


1-32727           ola                   2002-03-29 06:04  2002.04.11  
Help!!!! Помогите, уважаемые мастера....


14-32948          Pete                  2002-03-04 09:33  2002.04.11  
New Component...