AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Offene Fenster auslesen + aufs Closen eines best. reagieren
Thema durchsuchen
Ansicht
Themen-Optionen

Offene Fenster auslesen + aufs Closen eines best. reagieren

Ein Thema von Aurelius · begonnen am 16. Aug 2007 · letzter Beitrag vom 21. Aug 2007
Antwort Antwort
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#1

Offene Fenster auslesen + aufs Closen eines best. reagieren

  Alt 16. Aug 2007, 16:53
Hallo DP'ler, ich bins mal wieder

Den Titel konnt ich nicht besser formulieren

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.
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#2

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

  Alt 17. Aug 2007, 21:09
Push...
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 17. Aug 2007, 21:29
Mit IndexOf kannst du gucken, ob ein Eintrag in einer StringListe vohanden ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#4

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

  Alt 17. Aug 2007, 22:01
Werd mal versuchen ob ichs schaffe das zu lösen..
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#5

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

  Alt 18. Aug 2007, 11:54
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.
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 19. Aug 2007, 10:07
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;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#7

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

  Alt 20. Aug 2007, 01:18
Ich werds mal versuchen, wenn es aber nicht klappen sollte mach ichs eben mit nem unsichtbaren Memo-Fenster...
Jonas
  Mit Zitat antworten Zitat
Benutzerbild von Aurelius
Aurelius

Registriert seit: 29. Jan 2007
Ort: Erfurt
753 Beiträge
 
Delphi 7 Personal
 
#8

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

  Alt 21. Aug 2007, 16:15
Klappt, thx
Jonas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz