Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wm_syscommand (https://www.delphipraxis.net/54352-wm_syscommand.html)

Amd 2. Okt 2005 22:26


Wm_syscommand
 
Hallo...
Mit dieser Funktion kann ich alle geöffneten Fenster auf einmal schließen.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
h: HWnd;
begin
h := handle;
while h > 0 do
begin
ShowWindow(FindWindow(nil,'GetDesktopWindow'),SW_SHOW);
if isWindowVisible(h) then
postmessage(h, WM_SYSCOMMAND, SC_ClOSE, 0);
h := getnextwindow(h, GW_HWNDNEXT);
end;
end;
Klappt soweit auch, nur wenn ich mir zwischendurch den Desktop anzeigen lasse, mit dem "Desktop anzeigen-Button" in der Taskleisteund dann den Button in meinem Programm nochmal drücke, verschwindet der Dektop auf nimmer Wiedersehen.

Kann man den Desktop irgendwie ausschließen?

Habe es dann nochmal so versucht, klappt aber auch nicht.

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
h, b: HWnd;
begin
h := handle;
while h > 0 do
begin
ShowWindow(FindWindow(nil, 'GetDesktopWindow'), SW_SHOW);
if isWindowVisible(h) then
postmessage(h, WM_SYSCOMMAND, SC_ClOSE, 0);
h := getnextwindow(h, GW_HWNDNEXT);
end;
b := handle;
while b > 0 do
begin
ShowWindow(FindWindow(nil, 'Progman'), SW_SHOW);
if isWindowVisible(b) then
exit;
end;
end;
Grüße

turboPASCAL 3. Okt 2005 00:29

Re: Wm_syscommand
 
Zitat:

Code:
procedure TForm1.Button3Click(Sender: TObject);
var
  h, b: HWnd;
begin
  h := [b][color=#ff0000]handle[/color][/b]; [color=darkblue]// Wo kommt das her, was hat Handle für einen Wert ?[/color]
  while h > 0 do
[b][...][/b]
end;

Delphi-Quellcode:
procedure ...
var
  DeskH, PrgWh, wnd: HWnd;
begin
  DeskH := GetDesktopWindow;
  PrgWh := FindWindow(nil, 'Progman');

  wnd := getnextwindow(DeskH, GW_HWNDNEXT);
 
  while wnd > 0 do
  begin
    if (wnd <> DeskH) and (wnd <> PrgWin) then
      if isWindowVisible(wnd) then
        postmessage(wnd, WM_SYSCOMMAND, SC_ClOSE, 0);
    wnd := getnextwindow(wnd, GW_HWNDNEXT);
  end;
end;
Von der Überlegung her würde ich es so (oder so ähnlich) machen, ist aber jetzt getestet...

Amd 3. Okt 2005 02:28

Re: Wm_syscommand
 
Hallo...

vielen Dank für deine Hilfe.
Ich habe mich auch schon gewundert aber schließen tut er alle offenen Fenster auch so.
Delphi-Quellcode:
procedure ...
var
  DeskH: HWnd;
begin
    DeskH := handle;
 while DeskH > 0 do
  begin
    if isWindowVisible(DeskH) then
      postmessage(DeskH, WM_SYSCOMMAND, SC_ClOSE, 0);
    DeskH := getnextwindow(DeskH, GW_HWNDNEXT);
  end;
Wenn ich das Handle angebe, so wie du es gezeigt hast, funktioniert es überhaupt nicht.

Delphi-Quellcode:
ShowWindow(FindWindow(nil,'GetDesktopWindow'),SW_SHOW);
war überflüssig, wohl im Laufe des Abends übersehen.

turboPASCAL 3. Okt 2005 04:50

Re: Wm_syscommand
 
Zitat:

Wenn ich das Handle angebe, so wie du es gezeigt hast, funktioniert es überhaupt nicht.
War auch nur so eine Idee, wie gesagt nix getestet.

marabu 3. Okt 2005 08:42

Re: Wm_syscommand
 
Hallo Amd,

der Code in deinem Eröffnungsbeitrag wurde schon ohne ShowWindow() und mit SC_MINIMIZE anstelle SC_CLOSE veröffentlicht. Für das Minimieren gibt es inzwischen eine modernere Lösung:

Delphi-Quellcode:
uses
  ShlObj,
  ComObj;

procedure MinimizeAll;
var
  Shell : OleVariant;
begin
  Shell := CreateOleObject('Shell.Application') ;
  Shell.MinimizeAll;
end;
Wenn du beim Schließen der Programmfenster den program manager ausnehmen willst, dann musst du den Fenstertitel "Program Manager" abfangen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWnd;
  buf: array [0..255] of char;
begin
  h := Handle;
  while h > 0 do
  begin
    if IsWindowVisible(h) then
    begin
      GetWindowText(h, buf, SizeOf(buf));
      if StrPas(@buf) <> 'Program Manager' then
        PostMessage(h, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    end;
    h := GetNextWindow(h, GW_HWNDNEXT);
  end;
end;
@Matti: handle ist hier self.Handle - das window handle von Form1.

Grüße vom marabu

Sharky 3. Okt 2005 08:52

Re: Wm_syscommand
 
Zitat:

Zitat von marabu
...Für das Minimieren gibt es inzwischen eine modernere Lösung:

Hai ihr,

und falls es jemanden interessiert ;-)
Delphi-Quellcode:
procedure Shell(sMethod: Integer);
var
  Shell : OleVariant;
begin
 Shell := CreateOleObject('Shell.Application');
 case sMethod of
 0:
    //Minimizes all windows on the desktop
  begin
    Shell.MinimizeAll;
  end;
 1:
    //Displays the Run dialog
  begin
    Shell.FileRun;
  end;
 2:
    //Displays the Shut Down Windows dialog
  begin
    Shell.ShutdownWindows;
  end;
 3:
    //Displays the Find dialog
  begin
    Shell.FindFiles;
  end;
 4:
    //Displays the Date/Time dialog
  begin
    Shell.SetTime;
  end;
 5:
    //Displays the Internet Properties dialog
  begin
    Shell.ControlPanelItem('INETCPL.cpl');
  end;
 6:
    //Enables user to select folder from Program Files
  begin
    Shell.BrowseForFolder(0, 'My Programs', 0, 'C:\Programme');
  end;
 7:
    //Displays the Taskbar Properties dialog
  begin
    Shell.TrayProperties;
  end;
  8:
    //Un-Minimizes all windows on the desktop
  begin
    Shell.UndoMinimizeAll;
  end;
 end; {case}
 Shell := VarNull;
end;

Amd 3. Okt 2005 09:53

Re: Wm_syscommand
 
Hallo...danke für eure Hilfe.

@Sharky & marabu
Zitat:

...Für das Minimieren gibt es inzwischen eine modernere Lösung:
Danke, wußte ich auch noch nicht.

Ich habe es nun so gemacht, leider mit dem gleichen Ergebnis.
Der Desktop wird geschlossen.


Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  h: HWnd;
  buf: array [0..255] of char;
begin
  h := Handle;
  while h > 0 do
  begin
    if IsWindowVisible(h) then
    begin
      GetWindowText(h, buf, SizeOf(buf));
      if StrPas(@buf) <> 'Program Manager' then
        PostMessage(h, WM_SYSCOMMAND, SC_Close, 0);
    end;
    h := GetNextWindow(h, GW_HWNDNEXT);
  end;
end;
Es wäre ja das einfachste wenn es sowas wie
Code:
Shell.CloseAll;
(außer Program Manager)

Grüße :)

marabu 3. Okt 2005 10:05

Re: Wm_syscommand
 
Klebe mal eine ListBox auf deine Form und probiere das hier aus - vielleicht bekommst du dann einen Hinweis, was schief läuft:

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  h: HWnd;
  buf: array [0..255] of char;
begin
  ListBox.Items.Clear;
  h := Handle;
  while h > 0 do
  begin
    if IsWindowVisible(h) then
    begin
      GetWindowText(h, buf, SizeOf(buf));
      ListBox.Items.Add(StrPas(@buf));
//      if StrPas(@buf) <> 'Program Manager' then
//        PostMessage(h, WM_SYSCOMMAND, SC_Close, 0);
    end;
    h := GetNextWindow(h, GW_HWNDNEXT);
  end;
end;
marabu

Amd 3. Okt 2005 10:24

Re: Wm_syscommand
 
Sieht so aus:

Zitat:

Project1
Unit1.pas
Delphi 7 - Project1 [Ausführen von]
Delphi 7
Program Manager
ohne IDE
Zitat:

Project1
Program Manager
Mir ist aufgefallen, wenn ich alles in FormShow packe, beim klick auf die *.exe der Program Manager
mitgeschlossen wird.
Packe ich alles in einen Button klappt alles.

Amd 3. Okt 2005 13:19

Re: Wm_syscommand
 
ich brauche es aber im FormShow, ich bin damit nun schon seit gestern Mittag dran, das kann doch nicht so schwierig sein, was übersehe ich nur????


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
Seite 1 von 2  1 2      

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