![]() |
FindWindow findet Fenster nicht
Ich suche mit FindWindow ein Fenster, welches auch existiert
(z. B. 'Google - Microsoft Internet Explorer'). FindWindow meldet jedoch, dass er das Fenster nicht findet. Wenn ich mir mit EnumWindows alle Fenstertitel auflisten lassen, wird es aber angezeigt. Wo liegt der Fehler?? |
AW: FindWindow findet Fenster nicht
Schwer zusagen ohne deinen Code.
|
AW: FindWindow findet Fenster nicht
Evtl. Parameter verwechselt oder Leerzeichen im Fenstertitel :glaskugel:?
|
AW: FindWindow findet Fenster nicht
Oder eine falsche Fensterklasse angegeben (nil sollte z.B. gehen)? :glaskugel:
Und was ist denn der Rückgabewert von FindWindow? |
AW: FindWindow findet Fenster nicht
Hier im Forum gibt es ein nützliches Tool namens "WinSpy - der Fensterspion" oder so ähnlich. Damit kannst du Fenster anwählen und bekommst dann den korrekten Klassennamen und Titel angezeigt.
Als kleines Zusatzfeature lässt sich mit dem Programm sogar der passende FindWindow() Code dazu generieren. |
AW: FindWindow findet Fenster nicht
Die meisten Fenster werden gefunden, aber eben einzelne partout nicht.
Weil die Fenstertitel mit Paste/Copy übertragen werden und auch visuell verglichen werden, schließe ich die Variante "Leerzeichen vergessen" aus. WinSpy kann ich auf dem fremden Rechner nicht einsetzen. Scheidet aus. Hier auf Wunsch der Code zum Problem: Fenster auflisten Code:
Delphi-Quellcode:
Fenster abfragen Code:
function EnumWinProc(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
var WinCaption : string; Len: integer; begin Result := True; Len := GetWindowTextLength(Wnd); SetLength(WinCaption, Len); GetWindowText(Wnd, PChar(WinCaption), Len+1); if Trim(WinCaption) <> '' then Form1.Memo2.Lines.Add(Format('%.6x : %s', [Wnd, WinCaption])); end; procedure TForm1.BtnEnumWindowsClick(Sender: TObject); begin Memo2.lines.Clear; EnumWindows(@EnumWinProc, 0); end;
Delphi-Quellcode:
GetLastError war immer 0, deshalb auskommentiert.
procedure TForm1.BtnEnumChildsClick(Sender: TObject);
var hmain, hsub : HWND; ilen : integer; ptext : pChar; fenstername : string; begin Memo2.clear; fenstername := Edit_Fenstername.Text; if fenstername = '' then exit; hmain := FindWindow(nil, PChar(fenstername)); // if hmain = 0 then ShowMessage(inttostr(GetLastError())); if hmain <> 0 then // Fenster vorhanden! ShowMessage('Fenster gefunden: ' + fenstername) else ShowMessage('Fenster NICHT gefunden: ' + fenstername); end; |
AW: FindWindow findet Fenster nicht
IE mit Google ist bei mir in der Liste ....
Delphi-Quellcode:
function EnumWindowsProc1(Wnd: HWND; LB:TListBox): BOOL; stdcall;
const MyMaxName = 255; MyMaxText = 255; var ClassName: String; WindowText: String; begin Result := True; SetLength(ClassName, MyMaxName); SetLength(ClassName,GetClassName(Wnd, PChar(ClassName), MyMaxName)); SetLength(WindowText, MyMaxText); SetLength(WindowText,GetWindowText(Wnd,PChar(WindowText),MyMaxText)); LB.Items.AddObject('[' + ClassName + '] "' + WindowText + '"' + ' Handle: ' + IntToStr(Wnd), Pointer(Wnd)); end; procedure TForm1.Button1Click(Sender: TObject); begin Treeview1.Items.Clear; end; procedure TForm1.Button2Click(Sender: TObject); begin Treeview1.Items.Clear; Listbox1.Items.Clear; Listbox1.Items.BeginUpdate; EnumWindows(@EnumWindowsProc1, Integer(TObject(ListBox1))); Listbox1.Items.EndUpdate; Listbox1.Sorted := true; end; |
AW: FindWindow findet Fenster nicht
Bei mir auch - in der Fensterliste wird es aufgelistet.
Wenn ich aber mit FindWindow das Fenster abfrage wird als Handle "0" zurückgegeben - also nicht gefunden. DAS ist ja das Kuriosum. Merkwürdig ?! |
AW: FindWindow findet Fenster nicht
Ich bin mal so frei und poste dir den von WinSpy generierten Code, welcher auf meinem System (Win7 64 bit) wunderbar funktioniert:
Delphi-Quellcode:
Du hast in deinem Code schlicht und einfach vergessen den Klassennamen (in diesem Falle 'IEFrame') an FindWindow() zu übergeben.
var
wndMain: HWND; begin wndMain := FindWindow('IEFrame','Google - Windows Internet Explorer'); if wndMain <> 0 then begin ShowMessage('Window Handle: ' + IntToStr(wndMain)); end; end; |
AW: FindWindow findet Fenster nicht
Was sagt denn dein Programm wenn du
Delphi-Quellcode:
wndMain := FindWindow(NIL,'Google - Windows Internet Explorer');
abfragst? Bei NIL müsste es das Fenster doch auch finden oder nicht? |
AW: FindWindow findet Fenster nicht
Nein, eben nicht zwingend. Das genau ist nämlich der Fehler in deinem Code :wink: Aber den Klassennamen kannst du dir ja in deiner EnumWindowsProc auch einfach mittels GetClassName() ermitteln.
Edit: Mit dem IE Fenster scheint es (bie mir grade) allerdings auch mit nil als Klassennamen zu funktionieren. Darauf würde ich aber nicht umbedingt vertrauen, sondern besser den Klassennamen auch noch übergeben. |
AW: FindWindow findet Fenster nicht
Mein Google Fenster wird weder mit NIL noch mit "IEFrame" Parameter gefunden.
In der EnumWin1-Liste nach deinem Quellcode steht es mit [IEFrame] "Google - Microsoft Internet Explorer" Handle: 590512 eindeutig drin. Ich kann das nicht nachvollziehen :( |
AW: FindWindow findet Fenster nicht
Welchen IE verwendest Du denn? Mir kommt es komisch vor, dass da "Microsoft Internet Explorer" auftaucht, das Ding heißt doch schon seit einiger Zeit "Windows Internet Explorer".
|
AW: FindWindow findet Fenster nicht
Dieser Text steht in der Registry ... den kann man ändern.
|
AW: FindWindow findet Fenster nicht
Vielleicht solltest du einmal FindWindowW usw. ausprobieren, also immer die Unicodeversionen, natürlich auch mit PWideChar usw.
Denn du hast ja noch eine Delphiversion ohne Unicodesupport. Wenn da jetzt in der Überschrift Unicodezeichen drin sind, wäre das ein Problem, wenn du die Standardfunktionen und damit Ansi verwendest. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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-2025 by Thomas Breitkreuz