AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wm_syscommand

Ein Thema von Amd · begonnen am 2. Okt 2005 · letzter Beitrag vom 5. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
Amd

Registriert seit: 16. Jan 2005
38 Beiträge
 
#1

Wm_syscommand

  Alt 2. Okt 2005, 23:26
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
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Wm_syscommand

  Alt 3. Okt 2005, 01:29
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...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Amd

Registriert seit: 16. Jan 2005
38 Beiträge
 
#3

Re: Wm_syscommand

  Alt 3. Okt 2005, 03:28
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.

ShowWindow(FindWindow(nil,'GetDesktopWindow'),SW_SHOW); war überflüssig, wohl im Laufe des Abends übersehen.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: Wm_syscommand

  Alt 3. Okt 2005, 05:50
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Wm_syscommand

  Alt 3. Okt 2005, 09:42
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 Managerthen
        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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Wm_syscommand

  Alt 3. Okt 2005, 09:52
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Amd

Registriert seit: 16. Jan 2005
38 Beiträge
 
#7

Re: Wm_syscommand

  Alt 3. Okt 2005, 10:53
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 Managerthen
        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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Wm_syscommand

  Alt 3. Okt 2005, 11:05
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
  Mit Zitat antworten Zitat
Amd

Registriert seit: 16. Jan 2005
38 Beiträge
 
#9

Re: Wm_syscommand

  Alt 3. Okt 2005, 11:24
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.
  Mit Zitat antworten Zitat
Amd

Registriert seit: 16. Jan 2005
38 Beiträge
 
#10

Re: Wm_syscommand

  Alt 3. Okt 2005, 14:19
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????
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:23 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