Форум: "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.057 c
1-32773           mike.dld              2002-03-31 12:45  2002.04.11  
Директивы или что?


1-32898           Cupor                 2002-03-29 19:08  2002.04.11  
Панаели инструментов как в Photoshope


1-32750           Yuraz                 2002-03-30 15:48  2002.04.11  
Функция


1-32722           anod                  2002-03-30 00:37  2002.04.11  
Ошибка при создании popup меню


1-32781           Rooman                2002-03-23 17:54  2002.04.11  
Отсылка сообщения через зад:)