![]() |
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????
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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