Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.114.121] |
|
Сообщ.
#1
,
|
|
|
function FindChildWindow(const ClassName, Title: String; out Parent: THandle): THandle; type TInfo = record H, P: THandle; Cls, Ttl: PChar; end; type PInfo = ^TInfo; function EnumWindowsProc(hWnd: THandle; Info: PInfo): Boolean; stdcall; begin with Info^ do begin if H = 0 then begin H := FindWindowEx(hWnd, 0, Cls, Ttl); if H = 0 then EnumChildWindows(hWnd, @EnumWindowsProc, LParam(Info)) else begin // PostMessage(H, BM_CLICK, 0, 0); // Если надо нажать на кнопку, например P := hWnd; // Собственно, здесь можно сделать какую-то проверку и в случае, если это окно не подходит, выполнить Hnd := 0 и P := 0 end; end; Result := (H = 0); end; end; var Info: TInfo; begin with Info do begin H := 0; P := 0; Cls := PChar(ClassName); Ttl := PChar(Title); EnumWindows(@EnumWindowsProc, LParam(@Info)); Result := H; if @Parent <> nil then Parent := P; end; end; procedure TForm1.Button1Click(Sender: TObject); var Parent: THandle; begin ShowMessageFmt('Window handle = %X'#10'Real button handle = %X'#10'Parent handle = %X'#10'Real form handle = %X', [FindChildWindow('TButton', 'Button1', Parent), Button1.Handle, Parent, Form1.Handle]); end; EnumWindowsProc должен завершать работу, если результат = False, однако на практике такое происходит далеко не всегда. Это легко увидеть, если закомментить 14-ю строку if H = 0 then. Функция начинает работать долго (у меня аж полсекунды) и возвращает 0. Почему так? |
Сообщ.
#2
,
|
|
|
Цитата MSDN BOOL WINAPI EnumWindows( _In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam ); BOOL <> Boolean |
Сообщ.
#3
,
|
|
|
Цитата Shaggy @ BOOL <> Boolean BOOL = int, Boolean = byte. В итоге Result := (H = 0) устанавливает только младший байт результата (регистр AL), а в старших байтах (EAX) может оставаться мусор <> 0. |
Сообщ.
#4
,
|
|
|
Точно!
Поменял на LongBool, всё заработало. Спасибо! |