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
http://forum.assarbad.net/viewtopic.php?p=7068 gefunden und angepasst.
Ich nehme es vorweg, nichts passiert. lpss.Flags2 ist immer 0 egal welchen Style das
Startmenu hat.
Delphi-Quellcode:
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.
2. Änderung der Registry.
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
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung.