Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Offene Fenster auslesen + aufs Closen eines best. reagieren (https://www.delphipraxis.net/97810-offene-fenster-auslesen-aufs-closen-eines-best-reagieren.html)

Aurelius 16. Aug 2007 16:53


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 Klick
Ich habe es mit den Fenstern schon so weit gebracht:

Delphi-Quellcode:
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;
Ü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.

Aurelius 17. Aug 2007 21:09

Re: Offene Fenster auslesen + aufs Closen eines best. reagie
 
Push...

Luckie 17. Aug 2007 21:29

Re: Offene Fenster auslesen + aufs Closen eines best. reagie
 
Mit IndexOf kannst du gucken, ob ein Eintrag in einer StringListe vohanden ist.

Aurelius 17. Aug 2007 22:01

Re: Offene Fenster auslesen + aufs Closen eines best. reagie
 
Werd mal versuchen ob ichs schaffe das zu lösen..

Aurelius 18. Aug 2007 11:54

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:
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;
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.

bitsetter 19. Aug 2007 10:07

Re: Offene Fenster auslesen + aufs Closen eines best. reagie
 
Zitat:

Zitat von xX0815Xx

Delphi-Quellcode:
function EnumWin1(hWnd: THandle; FindWin: PString): Boolean; stdcall;
var
  WinText: AnsiString;
  Task : TStringList;
begin
  Result := True;
  Task := TStringlist.Create;

Hi,

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;

Aurelius 20. Aug 2007 01:18

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...

Aurelius 21. Aug 2007 16:15

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