Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.11;
Скачать: CL | DM;

Вниз

Поиск дочерних окон   Найти похожие ветки 

 
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?



Страницы: 1 вся ветка

Текущий архив: 2002.04.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-32880
Danila
2002-03-29 16:10
2002.04.11
Не удается сделать указатель на Canvas


3-32640
Malder
2002-03-15 20:45
2002.04.11
Ограничение полномочий пользователей...


4-33014
Evgeny
2002-02-09 08:41
2002.04.11
Wizard


1-32777
AndrewK
2002-03-28 14:10
2002.04.11
Конвертация таблицы в Excel


1-32803
SPeller
2002-04-01 10:00
2002.04.11
Брэйкпоинт в DLL