![]() |
Offene Fenster auslesen + aufs Closen eines best. reagieren
Hallo DP'ler, ich bins mal wieder :hi:
Den Titel konnt ich nicht besser formulieren :stupid: Ich möchte in meinem Programm eine Liste aller laufenden Anwendungen/offenen Fenster in einer Listbox ausgeben. In dieser markiert man dann einen Eintrag. Ein Timer soll überprüfen ob der Eintrag noch da ist, sobald dieser verschwunden ist soll der PC heruntergefahren werden. Für alle laufenden Prozesse gibts sowas schon ![]() Ich habe es mit den Fenstern schon so weit gebracht:
Delphi-Quellcode:
Überlegt hatte ich mir dass ein 2. EnumWindows die fenster alle in 1 StringList packt und man dann per Schleife guckt ob der markierte Eintrag noch vorhanden ist. Nur weiß ich nicht wie ich das machen soll.
var Prozess, aktiv : string;
function EnumWin(hWnd: THandle; FindWin: PString): Boolean; stdcall; // hier wird die erste Liste erstellt var WinText: AnsiString; begin Result := True; if IsWindowVisible(hWnd) and not boolean(GetWindowLong(hWnd, GWL_HWNDPARENT)) then begin SetLength(WinText, SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)); SendMessage(hWnd, WM_GETTEXT, Length(WinText)+ 1, integer(WinText)); if (length(WinText)> 0) and (WinText <> 'Program Manager') then Form1.ListBox1.Items.Add(WinText); end; end; procedure TForm1.Button1Click(Sender: TObject); var FindWin: String; begin Listbox1.Clear; FindWin:= 'Unbenannt - Editor'; EnumWindows(@EnumWin, integer(@FindWin)); end; procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var i : integer; begin if Button = mbLeft then begin i := Listbox1.ItemIndex; Prozess := Listbox1.Items.Strings[i]; Listbox1.Hint := Prozess; end; end; procedure TForm1.Button2Click(Sender: TObject); begin aktiv := Prozess; Timer1.Enabled := true; end; procedure TForm1.Timer1Timer(Sender: TObject); begin end; |
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
Push...
|
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
Mit IndexOf kannst du gucken, ob ein Eintrag in einer StringListe vohanden ist.
|
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
Werd mal versuchen ob ichs schaffe das zu lösen..
|
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
So ich habs getestet, aber es geht nicht so wie ich es gerne möchte...^^
Ich nehme and dass die Fensterleisten, welche im 2. EnumWindows ausgelesen werden, nicht in die StringList gepackt werden. Aus Spaß hab ich nämlich diese Liste einfach mal in eine Textdatei speichern lassen, und siehe da, diese war leer! Kann es vielleicht sein dass es so, wie ich es mir überlegt hab, nicht geht? Guckt euch das mal bitte an und sagt was ich falsch gemacht hab.
Delphi-Quellcode:
Ich könnte die Tasks auch in ein unsichtbares Memo-Fenster ausgeben, diese dann einlesen lassen und das dann mit "aktiv" vergleichen, aber das Gelbe vom Ei ist es sicher nicht.
function EnumWin1(hWnd: THandle; FindWin: PString): Boolean; stdcall;
var WinText: AnsiString; Task : TStringList; begin Result := True; Task := TStringlist.Create; if IsWindowVisible(hWnd) and not boolean(GetWindowLong(hWnd, GWL_HWNDPARENT)) then begin SetLength(WinText, SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)); SendMessage(hWnd, WM_GETTEXT, Length(WinText)+ 1, integer(WinText)); if (length(WinText)> 0) and (WinText <> 'Program Manager') then Task.Add(wintext); end; // aktiv ist ne globale variable, wurde vorher schon ermittelt... if Task.IndexOf(aktiv) = -1 then ShowMessage('Net da'); Task.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); var FindWin : String; begin FindWin:= 'Unbenannt - Editor'; EnumWindows(@EnumWin1, integer(@FindWin)); end; |
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
Zitat:
deine TStringList wird immer wieder neu erzeugt, besser wäre wenn du sie als Parameter mit übergibst und sie danach auswertest, so in etwa:
Delphi-Quellcode:
function EnumWin1(hWnd: THandle; Task: TStringList): Boolean; stdcall;
var WinText: AnsiString; begin Result := True; if IsWindowVisible(hWnd) and not boolean(GetWindowLong(hWnd, GWL_HWNDPARENT)) then begin SetLength(WinText, SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)); SendMessage(hWnd, WM_GETTEXT, Length(WinText)+ 1, integer(WinText)); if (length(WinText)> 0) and (WinText <> 'Program Manager') then Task.Add(wintext); end; end; procedure TForm1.Timer1Timer(Sender: TObject); var Task : TStringList; begin Task := TStringlist.Create; try EnumWindows(@EnumWin1, lParam(Task)); // aktiv ist ne globale variable, wurde vorher schon ermittelt... if Task.IndexOf(aktiv) = -1 then ShowMessage('Net da') finally Task.Free; end; end; |
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
Ich werds mal versuchen, wenn es aber nicht klappen sollte mach ichs eben mit nem unsichtbaren Memo-Fenster...
|
Re: Offene Fenster auslesen + aufs Closen eines best. reagie
Klappt, thx :D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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