![]() |
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:
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...
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. Hat Jemand eine Idde oder einen Link, den ich nicht gefunden habe? Gruesse ScotsMan |
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:
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.
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. Gruesse ScotsMan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 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