Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Alle Programme schliessen (https://www.delphipraxis.net/75218-alle-programme-schliessen.html)

capo 16. Aug 2006 00:51


Alle Programme schliessen
 
Ich würde mir gerne einiges geklicke ersparen und alle geöffneten programme auf einmal schliessen.
habe ein wenig rumprobiert und das ist dabei rausgekommen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWnd;
begin
form1.Visible:=false;
  h := handle;
  while h > 0 do
  begin
    if isWindowVisible(h) then
      postmessage(h, WM_SYSCOMMAND, SC_ClOSE, 0);
    h := getnextwindow(h, GW_HWNDNEXT);
  end;
end;
wenn ich auf desktop anzeigen klicke und dann auf meinen button klicke dann verschwinden auch alle icons auf meinem desktop.
wie geht das ohne das sich der komplette desktop entleert?

capo

RavenIV 16. Aug 2006 07:18

Re: Alle Programme schliessen
 
Vermutlich wird durch Deinen code auch der Ur-Explorer (der den Desktop darstellt) geschlossen.

Entweder musst Du dies verhindern oder Du musst alle Fenster schliessen, die den Ur-Explorer als Parent haben.

Luckie 16. Aug 2006 08:56

Re: Alle Programme schliessen
 
Wie wäre es mit EnumWindows, um gezielt die fensterhandle zu ermitteln, anstatt alle zaheln von null an durchzugehen, die ein Fensterhandle sein könnten?

turboPASCAL 16. Aug 2006 09:32

Re: Alle Programme schliessen
 
1.)
Ich würde die Message WM_CLOSE benutzen da nicht alle Programme auf SC_CLOSE reagieren.

2.)
Wenn du alle offenen Fenster schliesst bleibt nat. nix mehr übrig, du solltest also prüfen was du zu machen willst und was nicht.

Delphi-Quellcode:
program ProjectCloseAllWindows;

uses
  Windows;

var
  h: HWnd;
  buf: array[0..1024] of char;
  s: string;
  n: integer;

BEGIN
  h := handle;
  while h > 0 do
  begin
    if isWindowVisible(h) then
    begin
      GetClassName(h, buf, n);
      s := strPas(buf);
      if LowerCase(s) <> 'progman' then
        SendMessage(h, WM_SYSCOMMAND, WM_ClOSE, 0);
    end;
    h := getnextwindow(h, GW_HWNDNEXT);
  end;
END.
...müsste klappen.

capo 16. Aug 2006 10:05

Re: Alle Programme schliessen
 
@ RavenIV
sowas dachte ich mir auch.

@Luckie
im prinzip hast du ja recht.
müßte aber anders doch auch möglich sein, oder?

@turboPASCAL
hmm, nee hier passiert nichts.
woran kann das nun liegen?


capo

capo 17. Aug 2006 09:42

Re: Alle Programme schliessen
 
@Luckie
Zitat:

Wie wäre es mit EnumWindows, um gezielt die fensterhandle zu ermitteln, anstatt alle zaheln von null an durchzugehen, die ein Fensterhandle sein könnten?
würde ich auch lieber machen, nur dazu müsste ich ja wissen und kennen was so alles läuft und was auf keinen fall beendet werden darf, woher weiß ich was nicht beendet werden darf.
das ist doch noch viel schwieriger, oder nicht?

gruss, capo

capo 22. Aug 2006 23:29

Re: Alle Programme schliessen
 
hallo....warum antwortet mir niemand mehr?

Luckie 22. Aug 2006 23:31

Re: Alle Programme schliessen
 
Zitat:

Zitat von capo
@Luckie
Zitat:

Wie wäre es mit EnumWindows, um gezielt die fensterhandle zu ermitteln, anstatt alle zaheln von null an durchzugehen, die ein Fensterhandle sein könnten?
würde ich auch lieber machen, nur dazu müsste ich ja wissen und kennen was so alles läuft und was auf keinen fall beendet werden darf, woher weiß ich was nicht beendet werden darf.

Und woher weißt du das bei deiner Methode?

Was hast du überhaupt vor?

SirThornberry 22. Aug 2006 23:40

Re: Alle Programme schliessen
 
Im übrigen heißt der Titel auch "Alle Programme beenden" und nicht "alle Fenster schließen". Eventuell sollte man genau dort mal ansetzen. Einfach alle laufenden Prozesse auflisten und diese versuchen zu beenden. Ich denke Prozesse lassen sich leichter filtern als Fenster (da ein Prozess zig Fenster beinhalten kann)

capo 23. Aug 2006 05:39

Re: Alle Programme schliessen
 
hallo

Hallo Luckie
ist jetzt keine antwort auf deine frage - aber,
im prinzip bin ich mit meiner lösung zufrieden.
das einzigste was mich daran stört ist, dass der dektop verschwindet.
ich hätte gerne eine funktion, ähnlich der "desktop anzeigen" icon in windows, halt werden die fenster gleich geschlossen.
das bringt mich auf eine idee, man könnte doch überprüfen welche programme momentan in der taskleiste angezeigt werden und diese dann schliessen?


Hi SirThornberry
ja, aber so fit bin ich ehrlich gesagt nicht.
das kann ich noch verstehen, gerade so.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWnd;
begin
  h := handle;
  while h > 0 do
  begin
    if isWindowVisible(h) then
      postmessage(h, WM_SYSCOMMAND, SC_ClOSE, 0);
    h := getnextwindow(h, GW_HWNDNEXT);
  end;
end;
gruss und danke, capo


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 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