Thema: Delphi Change StartMenu

Einzelnen Beitrag anzeigen

Benutzerbild von colder
colder

Registriert seit: 23. Jul 2004
Ort: Bonn
30 Beiträge
 
Delphi 7 Professional
 
#1

Change StartMenu

  Alt 28. Mär 2006, 15:27
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.
  Mit Zitat antworten Zitat