![]() |
Change StartMenu
Hallo,
Ich muss für eine Software-Verteilung ein Tool schreiben welches interaktiv das Startmenu auf Classic schaltet. Zwei Ansätze bieten sich an. 1. hab ich unter ![]() Ich nehme es vorweg, nichts passiert. lpss.Flags2 ist immer 0 egal welchen Style das Startmenu hat.
Delphi-Quellcode:
2. Änderung der Registry.
Program StartMenu;
Uses windows, Messages, SysUtils, CommandLine; {$APPTYPE CONSOLE} {$R *.res} Type SHELLSTATE = Record Flags: DWORD; dwWin95Unused: DWORD; uWin95Unused: UINT; lParamSort: Integer; iSortDirection: Integer; uNotUsed: UINT; Flags2: DWORD; End; LPSHELLSTATE = ^SHELLSTATE; Const Version = '2.0'; SSF_SHOWALLOBJECTS = $00000001; SSF_SHOWEXTENSIONS = $00000002; SSF_HIDDENFILEEXTS = $00000004; SSF_SERVERADMINUI = $00000004; SSF_SHOWCOMPCOLOR = $00000008; SSF_SORTCOLUMNS = $00000010; SSF_SHOWSYSFILES = $00000020; SSF_DOUBLECLICKINWEBVIEW = $00000080; SSF_SHOWATTRIBCOL = $00000100; SSF_DESKTOPHTML = $00000200; SSF_WIN95CLASSIC = $00000400; SSF_DONTPRETTYPATH = $00000800; SSF_SHOWINFOTIP = $00002000; SSF_MAPNETDRVBUTTON = $00001000; SSF_NOCONFIRMRECYCLE = $00008000; SSF_HIDEICONS = $00004000; SSF_FILTER = $00010000; SSF_WEBVIEW = $00020000; SSF_SHOWSUPERHIDDEN = $00040000; SSF_SEPPROCESS = $00080000; SSF_NONETCRAWLING = $00100000; SSF_STARTPANELON = $00200000; SSF_SHOWSTARTPAGE = $00400000; Procedure SHGetSetSettings(Var lpss: SHELLSTATE; dwMask: DWORD; bSet: BOOL) stdcall; external 'shell32.dll'; //------------------------------------------------------------------------------ // Procedure : SwitchStartmenu //------------------------------------------------------------------------------ Procedure SwitchStartmenu(xpstyle: Boolean); Var lpss: SHELLSTATE; bIsXPstyle: Boolean; Begin ZeroMemory(@lpss, sizeof(lpss)); SHGetSetSettings(lpss, SSF_STARTPANELON, False); bIsXPstyle := (lpss.Flags2 And 2) = 2; If (bIsXPstyle <> xpstyle) Then Begin If (xpstyle) Then lpss.Flags2 := 2 Else lpss.Flags2 := 0; SHGetSetSettings(lpss, SSF_STARTPANELON, True); // Notify desktop of the change PostMessage(FindWindow('Progman', Nil), WM_USER + $60, 0, 0); End; PostMessage(FindWindow('Shell_TrayWnd', Nil), WM_USER + $0D, 0, 0); End; //------------------------------------------------------------------------------ // Procedure : SetCommands //------------------------------------------------------------------------------ Procedure SetCommands(); Var sValue: String; Begin // Keine Parameter dann EXIT If ParamCount = 0 Then EXIT; If GetCmdValue(sValue, 'xp', True) Then If Sametext(sValue, 'OFF') Then SwitchStartmenu(True) Else SwitchStartmenu(False); End; Begin SetCommands; End. Hier läuft das wie folgt. Im Entry: HKCU\Software\Microsoft\Windows\CurrentVersion\Exp lorer\ShellState Byte 33 anpassen 00 = Windows XP 02 = Windows Classic Das Problem hier, bevor diese Werte gesetzt werden, muss der Explorer abgeschossen werden (der chached die Werte), dann den Explorer wieder starten. Siehe da, Startmenu geändert. Leider wirft das abschiessen/starten des Explorer andere Probleme auf (ärgerlich wenn irgend welche Tools im Tray liegen) und besonders Elegant ist es sicher auch nicht. Frage, was ist an der obigen Routine falsch, bzw. wie kann ich den geänderten ShellState dem Explorer unterjubeln ohne die harte Tour? Irgendwas mit Systemparameterinfo... oder so ???? Help Help Help gruss andreas |
Re: Change StartMenu
Moin Andreas,
die Registry-Variante könntest Du noch einmal in Verbindung mit SendMessage, HWND_BROADCAST und WM_SETTINGCHANGE probieren, denn wenn Du die Einstellung manuell änderst, musst Du den Explorer ja auch nicht neu starten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 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