![]() |
Dein Weg kann theoretisch auch funktionieren. Man weiß ja nie wie Windows reagiert. :D
|
Na ja, wenigstens etwas. Aber heut abend nicht mehr, ich hab zu viel getrunken, um das noch hinzukriegen und zu wenig, um es problemlos zu programmieren :mrgreen:
|
Ich glaub, ich bin zu blöd, um EnumWindows zu benutzen. Folgenden Code benutze ich zum Testen:
Code:
und
function EnumWindowsProc(Hnd: HWND; Lines: TStrings): Boolean; stdcall;
var FileName: Array[0..255] of Char; begin GetWindowModuleFileName(Hnd, @FileName, 255); Lines.Add(InttoStr(Hnd) + ': ' + FileName); if FileName = AppName then begin Result := False; end else begin Result := True; end; end;
Code:
Doch komischerweise kommen in dieser Liste immer die gleichen Handles vor. Wenn ich die in einem ShowWindow-Aufruf verwende, veränder ich nicht das Fenster, das ich gewollt hab (also das meines Programmes), sondern irgendein anderes, meistens eins von meinem AntiVirus-Programm. Was heißt eigentlich genau "top-level-window"? Weil das, was ich gedacht habb, dass es heißt, kann es wohl nicht heißen, denn sonst hätt ich wohl kaum 30 dieser Fenster mit dem gleichen Pfad und Dateinamen gefunden.
AppName := ParamStr(0);
EnumWindows(@EnumWindowsProc, Integer(Form1.Memo1.Lines)); |
top-level-window = Hauptfenster der Anwendung.
mit diesem Code kannst du herausfinden welches deiner Fenster du gefunden hast:
Code:
var
Buf: array[0..1024] of Char; ClassName: string; begin SetString(ClassName, Buf, GetClassName(Hnd, Buf, 1024)); if ClassName = 'TApplication' then ... else if ClassName = 'TForm1' then ... else if ClassName = 'TForm2' ... end; |
So, nachdem ich schon aufgegeben hatte, hab ich jetzt doch mal weiter gemacht. Auch wenn ich es sehr seltsam finde, dass ich in meiner Anwendung auch Handles, die laut ClassName zu WinAmp gehören, finde, scheint eine Sache zu funktionieren: Wenn ich das Handle von 'Form1' als Parameter in ShowWindow einsetze, funktioniert es. Das Problem ist nur, dass es jeweils zwei Handles zu TForm1, TApplication etc. gibt.
Falls es jemanden interessiert, hier soweit der Code der Callback-Funnktion:
Code:
Auf der Form befindet sich z. B. eine Listbox. Folgendermaßen wird die Callback-Funktion aufgerufen:
function EnumWindowsProc(Hnd: HWND; Lines: TStrings): Boolean; stdcall;
var FileName: Array[0..255] of Char; ClassName: String; Buf: Array[0..1023] of Char; begin GetWindowModuleFileName(Hnd, @FileName, 255); if FileName = AppName then begin SetString(ClassName, Buf, GetClassName(Hnd, Buf, 1024)); if Classname = 'TForm1' then begin Lines.Add(Classname + ':' + InttoStr(Hnd)); Result := False; ShowWindow(hnd,SW_MAXIMIZE); end; end else begin Result := True; end; end;
Code:
Jetzt versuch ich das gleiche Mal für Anwendungen, die nicht in Delphi geschrieben sind.
AppName := ParamStr(0);
EnumWindows(@EnumWindowsProc, Integer(Listbox1.Items)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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