![]() |
FindWindowEx Logik
Hey!
Habe ein kleines Problem mit der FindWindowEx() Funktion. Ich ermittle von einem ChildControl das Parent Handle mittels GetParent und suche dann später das ChildControl anhand der FindWindowEx() wieder. Aber: Er findet es nicht! FindWindowEx() gibt immer null zurück! Warum? Evtl mache ich einen Logik Fehler.
Delphi-Quellcode:
var
p1, p2: PChar; wndChild, wndParent : HWND;
Delphi-Quellcode:
wndChild := ... // ein gültiges Handle zuweisen
// Parent von wndChild ermitteln wndParent := GetParent(wndChild); p1 := PChar(_GetClassName(wndChild)); // _GetClassName() liefert den KlassenNamen von einem Handle p2 := PChar(_GetWinText(wndChild)); // _GetWinText() liefert den Text von einem Handle // das ChildControl suchen wndChild := FindWindowEx(wndParent, 0, p1, p2); // <--- gibt immer 0 zurück! |
Re: FindWindowEx Logik
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var WndParent: HWND; WndChild: HWND; ClsNameChild: String; TitleChild: String; begin WndChild := Button1.Handle; WndParent := Windows.GetParent(WndChild); SetLength(ClsNameChild, 1024); SetLength(ClsNameChild, GetClassName(WndChild, PChar(ClsNameChild), Length(ClsNameChild))); SetLength(TitleChild, 1024); SetLength(TitleChild, GetWindowText(WndChild, PChar(TitleChild), Length(TitleChild))); WndChild := FindWindowEx(WndParent, 0, PChar(ClsNameChild), PChar(TitleChild)); if WndChild = 0 then RaiseLastOSError; end; |
Re: FindWindowEx Logik
Hi Sprint,
Danke für deine Antwort! Aber leider hilft mir dein Code auch nicht weiter. Zudem kann GetWindowText nur den Text von Fenster-Captions zurückgeben und nicht Controls. (siehe msdn) Ich poste mal einen allgemeinen Code zu meinem Problem:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var wnd: HWND; begin wnd := FindWindow('TAppBuilder', nil); // wnd ist <> 0, alles ok bis jetzt wnd := FindWindowEx(wnd, 0, 'TControlBar', nil); // wnd ist <> 0, alles ok bis jetzt wnd := FindWindowEx(wnd, 0, 'TDockToolBar', 'Standard'); // wnd ist immer null, obwohl das Child 'TDockToolBar' existiert! if wnd <> 0 then begin ShowMessage('gefunden'); end; end; Fensterstruktur:
Code:
Klassen Name: "TAppBuilder" | Title: "Delphi 6 - Project1" | Handle: 1966888
1573686: TControlBar 2097588: TDockToolBar "Menu bar" 655736: TDockPanel "Component Palette" 721300: TComponentPaletteTabControl 590250: TPanel 590446: TPageScroller 655758: TPalette "Palette" 1769832: TDockToolBar "Custom" 655980: TDockToolBar "Desktop" 1245788: TDesktopComboBox "<None>" 917904: Edit "<None>" 1049424: TDockToolBar "Debug" 852428: TDockToolBar "View" 655802: TDockToolBar "Standard" |
FindWindowEx Problem (2)
Hi,
Habe 3 Codes und alle sollten das gleiche machen, nur tun sie das nicht! Code1 funktioniert, aber Code2, Code3 nicht. Was mache ich da falsch? Code1: ShowMessage('Gefunden'); wird angezeigt.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var wndApp, wndControlBar, wnd: HWND; begin wndApp := FindWindow('TAppBuilder', nil); wndControlBar := FindWindowEx(wndApp, 0, 'TControlBar', nil); // wndControlBar ist immer <> 0 wnd := FindWindowEx(wndControlBar, 0, 'TDockToolBar', nil); wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil); wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil); wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil); wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil); wnd := FindWindowEx(wndControlBar, wnd, 'TDockToolBar', nil); // wnd ist immer <> 0 if wnd <> 0 then begin ShowMessage('Gefunden'); // Klasse von wnd : TDockToolBar, Text von wnd : Standard end; end; Code2: ShowMessage('Gefunden'); wird nie angezeigt.
Delphi-Quellcode:
Code3: ShowMessage('Gefunden'); wird nie angezeigt.
procedure TForm1.Button2Click(Sender: TObject);
var wndApp, wndControlBar, wnd: HWND; begin wndApp := FindWindow('TAppBuilder', nil); wndControlBar := FindWindowEx(wndApp, 0, 'TControlBar', nil); wnd := FindWindowEx(wndControlBar, 0, 'TDockToolBar', 'Standard'); // wnd wird immer 0! if wnd <> 0 then begin ShowMessage('Gefunden'); // Class: TDockToolBar, Text: Standard end; end;
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var wndApp, wndControlBar, wnd: HWND; begin wndApp := FindWindow('TAppBuilder', nil); wndControlBar := FindWindowEx(wndApp, 0, 'TControlBar', nil); wnd := FindWindowEx(wndControlBar, 0, nil, 'Standard'); // wnd wird immer 0! if wnd <> 0 then begin ShowMessage('Gefunden'); // Class: TDockToolBar, Text: Standard end; end; FensterStruktur:
Code:
Klassen Name: "TAppBuilder" | Title: "" | Handle: 1966888
1573686: TControlBar 2097588: TDockToolBar "Menu bar" 655736: TDockPanel "Component Palette" 721300: TComponentPaletteTabControl 590250: TPanel 590446: TPageScroller 655758: TPalette "Palette" 1769832: TDockToolBar "Custom" 655980: TDockToolBar "Desktop" 1245788: TDesktopComboBox "<None>" 917904: Edit "<None>" 1049424: TDockToolBar "Debug" 852428: TDockToolBar "View" 655802: TDockToolBar "Standard" |
Re: FindWindowEx Logik
Habe diese Antwort in der Delphi Newsgroup erhalten:
Zitat:
Childfenster in einem anderen Prozess sucht. Grund: FindWindowEx vergleicht bei Angabge von lpszWindow die Übereinstimmung des FensterNamens (lpszWindow) mittels GetWindowText, welche aber nicht zuverlässig ChildFenster Text in einem anderen Prozess ermitteln kann.
Delphi-Quellcode:
HWND FindWindowEx(
HWND hwndParent, // handle to parent window HWND hwndChildAfter, // handle to a child window LPCTSTR lpszClass, // pointer to class name LPCTSTR lpszWindow // pointer to window name ); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz