Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Aktualisierung der Einstellungen im Windows Explorer (https://www.delphipraxis.net/178930-aktualisierung-der-einstellungen-im-windows-explorer.html)

ScotsMan 4. Feb 2014 14:37

Aktualisierung der Einstellungen im Windows Explorer
 
Hallo, allerseits,

es gibt an verschiedenen Stellen bereits einige Threads dazu, aber irgendwie keine Loesung:

Wenn ich in Delphi Registrierungswerte fuer Explorereinstellungen aendere, dann merkt das der Explorer nicht. Erst, wenn man ihn mit F5 aktualisiert (oder: sich ab- und anmeldet), ist alles richtig. Logisch: er ist ja immer aktiv, also muss ich ihn "kicken", damit er schneidet, dass etwas geschehen ist. Nur wie?

Die verschiedenen Threads beschreiben viele Loesungen, einige habe ich ausprobiert:

Delphi-Quellcode:
program RegEdit_TPS;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Windows, Messages, Registry, ShlObj;

var RegObj : TRegistry;
    R     : Integer;
    wndMain: HWND;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
    RegObj := TRegistry.Create;
    RegObj.RootKey := $80000001;
    if RegObj.OpenKey ('\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', false) then
      begin
        RegObj.WriteInteger ('HideFileExt',0);
// Versuche ueber Settingchange
        Sendmessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
        SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0,
                            SMTO_ABORTIFHUNG, 100, @R );
// Versuch ueber SHChangeNotify
        SHChangeNotify(SHCNE_GLOBALEVENTS,SHCNF_NOTIFYRECURSIVE + SHCNF_FLUSH,nil,nil);
// Versuch ueber SystemParametersInfo
        SystemParametersInfo (SPI_SETDESKWALLPAPER,0, nil,SPIF_SENDWININICHANGE);
// ... und das Explorerfenster wird auch nicht gefunden
       wndMain := FindWindow('explorer.exe',nil);
       if wndMain <> 0 then
         PostMessage(wndMain, WM_KEYDOWN, VK_F5, 0) else
         Messagebox (0, 'huhu','huhu',0);
      end;
    RegObj.Free;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Funktionieren tuts allerdings alles nicht: Die Funktion (hier: Erweiterungen einblenden) kommt erst nach F5. Das ist zwar besser als nie, aber ich haette es eben gerne gleich...

Hat Jemand eine Idde oder einen Link, den ich nicht gefunden habe?

Gruesse
ScotsMan

ScotsMan 5. Feb 2014 15:01

AW: Aktualisierung der Einstellungen im Windows Explorer
 
Hallo, nochmals,:-D

nach ewigem Herumsuchen und einigen Hinweisen im Auto-IT-Forum habe ich nun die Message gefunden, die wohl die Aktualisierung anschiebt. Nur das richtige Fenster war noch ein Problem, da habe ich jetzt schamlos bei Jemandem geklaut, der bei Luckie geklaut hat...

Delphi-Quellcode:
program RegEdit_TPS;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Windows, Messages, Registry, ShlObj;

procedure ProvideExplorerOptions;
var
   Progman: HWND;

   function EnumDefViewProc(Wnd: HWND; out DefView: HWND): BOOL; stdcall;
   begin
     PostMessage(Wnd, WM_Command, 28931, 0);
     Result := true;
   end;

begin
   Progman := FindWindow('ProgMan', nil);
   If Progman <> 0 then
     begin
       PostMessage(ProgMan, WM_Command, 28931, 0);
       EnumChildWindows(ProgMan, @EnumDefViewProc, 0);
     end;
   Progman := FindWindow('WorkerW', nil);
   If Progman <> 0 then
     begin
       PostMessage(ProgMan, WM_Command, 28931, 0);
       EnumChildWindows(ProgMan, @EnumDefViewProc, 0);
     end;
end;

var RegObj : TRegistry;
    R     : Integer;

begin
  try
    { TODO -oUser -cConsole Main : Code hier einfügen }
    Writeln ('Providing Explorer Options...');
    Writeln ('Please wait...');
    RegObj := TRegistry.Create;
    RegObj.RootKey := $80000001;
    if RegObj.OpenKey ('\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', false) then
      begin
        RegObj.WriteInteger ('HideFileExt',0);
// hier weitere Optionen festlegen...
    //
// Versuche ueber Settingchange
        Sendmessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
        SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0,
                            SMTO_ABORTIFHUNG, 100, @R );
// Versuch ueber SHChangeNotify
        SHChangeNotify(SHCNE_GLOBALEVENTS,SHCNF_NOTIFYRECURSIVE + SHCNF_FLUSH,nil,nil);
        SHChangeNotify(SHCNE_ASSOCCHANGED,0,NIL,NIL);
// Versuch ueber SystemParametersInfo
        SystemParametersInfo (SPI_SETDESKWALLPAPER,0, nil,SPIF_SENDWININICHANGE);
// ... und das Explorerfenster mit allen Unterfenstern ansprechen
       ProvideExplorerOptions;
      end;
    RegObj.Free;
  except
    on E: Exception do
      begin
       Writeln ('Error during search');
       Writeln(E.ClassName, ': ', E.Message);
      end;
  end;
end.
Der Text oben scheint zumindest zu helfen. Bemerkungen sind willkommen, _mir_ ist erstmal geholfen, weil nun jeder sich neu Anmeldende definitiv wieder die Dateierweiterungen sieht, egal, was er eingestellt hat.

Gruesse
ScotsMan


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf