![]() |
Windows 7 Theme wechseln
Ich würde gerne aus meinem Delphi-Programm das aktuell verwendete Windows Design Theme ändern können.
Also beispielsweise auf C:\Windows\Resources\Themes\architecture.theme umschalten. Unter XP gab's ja noch spezielle ThemeManager-Schnittstellen dafür, unter Win7/Vista finde ich jedoch leider nichts dazu. Die einfachste Methode ist wohl, die Theme-Datei direkt auszuführen:
Delphi-Quellcode:
.
ShellExecute(0, 'open', PChar('C:\Windows\Resources\Themes\architecture.theme'), nil, nil, SW_SHOWNORMAL);
Dann wird das Design auch tatsächlich sofort übernommen. Allerdings öffnet sich dabei leider auch die Theme-Verwaltung von Windows, die noch manuell geschlossen werden muss. Gibt es eine bessere Möglichkeit, um Themes unter Windows 7 direkt aktivieren zu können? Oder lässt sich das Öffnen der Themes-Verwaltung unterbinden? Oder notfalls irgendwie gezielt, schnell automatisch schließen? |
AW: Windows 7 Theme wechseln
Ich denke, dass Dir die System-Funkton "SetSystemVisualStyle" weiterhelfen wird. Auf den ersten Blick scheint die aber ... "unterdurchschnittlich" ... dokumentiert zu sein.
Google liefert Dir aber eine Handvoll Treffer, u.a. auch ![]() |
AW: Windows 7 Theme wechseln
Hm, ich habe mich jetzt eine Weile über die empfohlene Funktion SetSystemVisualStyle eingelesen. In allen Beispielen wurde diese aber verwendet, um eine .msstyles Datei zu aktivieren, nicht eine .theme Datei. Diese .msstyles-Dateien wurden aber soweit ich weiß nur XP verwendet. Zumindest finde ich in meinem Win7 keine .msstyles-Dateien (doch genauer gesagt exakt eine "aero.msstyles", aber da sehe ich erstmal keinen Bezug zu den vielen vorhandenen .theme Dateien.)
Habe jetzt trotzdem mal versucht, was die Funktion unter Win7 mit einer .theme Datei bewirkt:
Delphi-Quellcode:
Als Rückgabewert erhalte ich -1878589247, was mir leider nichts sagt. Bewirken tut die Funktion augenscheinlich auch nichts.
function SetSystemVisualStyle(pszFilename, pszColor, pszSize: PChar;
dwReserved: Integer): Integer; stdcall; external 'uxtheme.dll' index 65; res := SetSystemVisualStyle('C:\Windows\Resources\Themes\nature.theme', 'NormalColor', 'NormalSize', 1); |
AW: Windows 7 Theme wechseln
Zitat:
Wenn es tatsächlich keine direkte Lösung geben sollte, würde mich mich mittlerweile auch mit einem manuellen Schließen des Theme-Fensters begnügen. Leider bekomme ich das auch nicht so recht hin... Das Problem ist, dass beim Aufrufen eines cpl-Fensters in nachfolgender Form kein passendes Handle zurückgeliefert wird. Hier mal aufs Nötigste heruntergebrochen:
Delphi-Quellcode:
Wird zwar geöffnet aber nicht wieder geschlossen. Vermutlich gehört das zurückgegebene Handle zu rundll32.exe oder einem anderen aufrufenden Prozess.
h := ShellExecute(0, 'open', PChar('C:\Windows\system32\desk.cpl'), nil, nil, SW_SHOWNORMAL);
sleep(5000); PostMessage(h, WM_CLOSE, 0, 0); Ich könnte das Handle nachträglich per FindWindow holen, aber dafür muss ich den Fenstertitel festlegen, der aber sprachabhängig ist und ich kann keine bestimmte Sprache vorab voraussetzen. |
AW: Windows 7 Theme wechseln
Der Artikel bringt vielleicht etwas Licht ins Dunkel bei den .THEME-Dateien:
![]() Das sind wohl eigentlich INI-Dateien, wo zwar auf die Aero.msstyles verwiesen wird, aber auch noch andere Infos, wie Bildschirmhintergrund und Mauszeiger festgelegt werden. Vielleicht ist Dir das ja noch ein Ansatzpunkt, Deine Suche noch mal in eine andere Richtung zu gestalten? Irgendwie müsste das ja bestimmt gehen... :) |
AW: Windows 7 Theme wechseln
Argh, lies doch bitte mal die Dokumentation, was ShellExecute für einen Wert zurück gibt.
Suche mit FindWindow das Fenster und Sende an das gefundene Handle die WM_CLOSE Nachricht. |
AW: Windows 7 Theme wechseln
Zitat:
Zitat:
Zitat:
|
AW: Windows 7 Theme wechseln
Dann starte den Prozess mit CreateProcess oder ShellExecuteEx, dann hast du ein Prozesshandle, welches du TerminateProcess übergeben kannst. Ist zwar nicht sehr schön, den Prozess so hart zu beenden. Man könnte auch alle Fenster enummerieren und gucken zu welchen Prozess sie gehören und wenn man das richtige gefunden hat WM_CLOSE an das Fenster senden. Das wäre die sauberere aber aufwendigerer Lösung.
Und nebenbei bemerkt, gibt es zu dem Problem (Programm starten und beenden) schon genug Beitrage hier im Forum. |
AW: Windows 7 Theme wechseln
Zitat:
Mein Versuch:
Delphi-Quellcode:
Das öffnet zwar den Dialog, schließt ihn aber nicht wieder.
ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfo.lpVerb := 'runas'; ShExecInfo.lpFile := 'control'; ShExecInfo.lpDirectory := nil; ShExecInfo.lpParameters := 'C:\Windows\system32\desk.cpl desk,@Themes'; ShExecInfo.nShow := SW_SHOWNORMAL; ShellExecuteEx(@ShExecInfo); sleep(5000); //PostMessage(ShExecInfo.Wnd, WM_CLOSE, 0,0); TerminateProcess(ShExecInfo.hProcess, 0); Ich weiß leider wirklich nicht, wie ich das Handle des Fensters bekommen soll. :( |
AW: Windows 7 Theme wechseln
Wie wäre es mit einem Versuch über die Registry und dann einer Broadcast-Message mit WM_STYLECHANGED?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 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