![]() |
Wm_syscommand
Hallo...
Mit dieser Funktion kann ich alle geöffneten Fenster auf einmal schließen.
Delphi-Quellcode:
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.
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; Kann man den Desktop irgendwie ausschließen? Habe es dann nochmal so versucht, klappt aber auch nicht.
Delphi-Quellcode:
Grüße
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; |
Re: Wm_syscommand
Zitat:
Delphi-Quellcode:
Von der Überlegung her würde ich es so (oder so ähnlich) machen, ist aber jetzt getestet...
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; |
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:
Wenn ich das Handle angebe, so wie du es gezeigt hast, funktioniert es überhaupt nicht.
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;
Delphi-Quellcode:
war überflüssig, wohl im Laufe des Abends übersehen.
ShowWindow(FindWindow(nil,'GetDesktopWindow'),SW_SHOW);
|
Re: Wm_syscommand
Zitat:
|
Re: Wm_syscommand
Hallo Amd,
der Code in deinem Eröffnungsbeitrag wurde schon ohne ShowWindow() und mit SC_MINIMIZE anstelle SC_CLOSE ![]()
Delphi-Quellcode:
Wenn du beim Schließen der Programmfenster den program manager ausnehmen willst, dann musst du den Fenstertitel "Program Manager" abfangen:
uses
ShlObj, ComObj; procedure MinimizeAll; var Shell : OleVariant; begin Shell := CreateOleObject('Shell.Application') ; Shell.MinimizeAll; end;
Delphi-Quellcode:
@Matti: handle ist hier self.Handle - das window handle von Form1.
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; Grüße vom marabu |
Re: Wm_syscommand
Zitat:
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; |
Re: Wm_syscommand
Hallo...danke für eure Hilfe.
@Sharky & marabu Zitat:
Ich habe es nun so gemacht, leider mit dem gleichen Ergebnis. Der Desktop wird geschlossen.
Delphi-Quellcode:
Es wäre ja das einfachste wenn es sowas wie
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;
Code:
(außer Program Manager)
Shell.CloseAll;
Grüße :) |
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:
marabu
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; |
Re: Wm_syscommand
Sieht so aus:
Zitat:
Zitat:
mitgeschlossen wird. Packe ich alles in einen Button klappt alles. |
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????
|
Re: Wm_syscommand
Das willst du jetzt bestimmt nicht lesen, aber bei mir funktioniert das so - direkt aus dem laufenden Quelltext kopiert:
Delphi-Quellcode:
marabu
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) else ShowMessage('not closing program manager'); end; h := GetNextWindow(h, GW_HWNDNEXT); end; end; |
Re: Wm_syscommand
Moin Amd,
unter welchem Betriebssystem hast Du das getestet? Marabus Beispiel funktioniert, z.B. auch unter Windows 2000 SP4. (mit und ohne ShowMessage) |
Re: Wm_syscommand
Hallo Christian...
ich arbeite mit WinXp inkl. Sp2 Grüße Amd |
Re: Wm_syscommand
@marabu
Zitat:
Ich muss auch sagen das ich deinen Beitrag auch ersteinmal überlesen habe, es kamen soviele auf einmal. Aber..., bei mir sieht mein desktop mit deinem Sourcecode auch so aus. ![]() Führe erstmal deinen Code aus...dann klickst du auf den "Desktop anzeigen" Button unten im Schnellstart der Taskleiste, dann führe bitte nochmal deinen Code aus. Und....? Grüße Amd |
Re: Wm_syscommand
Habe deine Vorgehensweise nachvollzogen und kann dir den Fehler bestätigen. Leider werde ich ihn heute abend nicht mehr analysieren können.
marabu |
Re: Wm_syscommand
moin marabu
Zitat:
Grüße Amd |
Re: Wm_syscommand
Hallo Amd,
vielleicht ist dein Vorhaben gar nicht so einfach zu realisieren, wie in deinem ersten Ansatz. Zumindest habe ich einen Link gefunden, wo sich die Diskutanten deutlich mehr Arbeit machen: ![]() Grüße vom marabu |
Re: Wm_syscommand
Hey danke für den Link, hilft weiter :)
|
Re: Wm_syscommand
Was mir aufgefallen ist, wenn ich alles in FormShow packe ist der Deektop weg ...
wenn ich alles in in einen Button packe ist alles ok. |
Re: Wm_syscommand
Zitat:
Delphi-Quellcode:
funktioniert es nun.
OnPaint
Danke für eure Hilfe :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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