![]() |
Vista/Win7 Aero Farbe auslesen
Liste der Anhänge anzeigen (Anzahl: 2)
Hier eine Möglichkeit über die Windows-API die Farbe des Aero-Looks auszulesen, der ab Windows Vista verfügbar ist. Dies kann praktisch sein, wenn man sein Programm an diese Farbe anpassen möchte. Beispielsweise nutzt das neue "Windows Live Mail" diese Funktion, um die Tönung der Menuleisten dynamisch der Aero-Farbe anzupassen. Dies verbessert das äußere Erscheinungsbild des Programms.
Wichtig!: Ich verwende in meinem Quellcode eine Unit mit dem Namen "dwmapi". Diese stammt nicht von mir selbst, sondern von dem User MarcoWarm und ist ![]() Um die Windows Aero Farbe auszulesen:
Delphi-Quellcode:
Über die Message WM_DWMCOLORIZATIONCOLORCHANGED ist es möglich ein Ereignis bei der Veränderung der Aero-Farbe auszulösen.
uses dwmapi;
... function GetAeroColor:Tcolor; {****************************************************} // Dies Funktion gibt die Aero-Farbe als TColor zurück // Unterstüzt das OS kein Windows Aero, so wird der // Wert clnone ausgegeben {****************************************************} var // Gibt an ob Fenster Undurchsichtig sind // (hier nicht weiter verwendet) OpaqueBlend: bool; // Gibt die Farbe an farbe : dword; // A=AlphaValue; RGB=R,G und B Farbwerte A,R,G,B: integeR; // um festzustellen, ob Aero unterstüzt wird osVInfo: TOSVersionInfo; begin // Feststellen, ob Windows Aero unterstüzt wird ZeroMemory(@osVinfo, SizeOf(osVinfo)); OsVinfo.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO); if ((( not GetVersionEx(osVInfo)) and (osVinfo.dwPlatformId <> VER_PLATFORM_WIN32_NT) and (osVinfo.dwMajorVersion < 5))) or (dwmapi.DWM_GetColorizationColor(farbe,OpaqueBlend) = S_False) then begin // Falls nicht wird das Ergebnis clnone ausgegeben result := clnone; exit; end; // AlphaValue und RGB-Werte ermitteln A := (farbe and $FF000000) shr 24; R := (farbe and $FF0000) shr 16; G := (farbe and $FF00) shr 8; B := (farbe and $FF); // AlphaValue auf RGB-Werte anwenden // Die 40 ermöglicht eine kräftigere Darstellung der Farbe r := r + (255-a-40); g := g + (255-a-40); b := b + (255-a-40); // Überprüfen ob die RGB-Werte zulässig sind if r < 0 then r := 0; if g < 0 then g := 0; if b < 0 then b := 0; if r > 255 then r := 255; if g > 255 then g := 255; if b > 255 then b := 255; // Farbe errechnen und ausgeben result := rgb(r,g,b); end; Ein Beispielprojekt, in dem sowohl die Message WM_DWMCOLORIZATIONCOLORCHANGED, als auch die Function GetAeroColor angewendet werden, liegt bei. Links zum MSDN: ![]() ![]() Über ein Feedback würde ich mich sehr freuen. :wink: |
Re: Vista/Win7 Aero Farbe auslesen
1. Die Unit auch ist Teil der JEDI API.
2. Und Vista fängt bei Version 6 an. 3. Rückgabewerte mit HRESULT prüft man mit SUCCEEDED(hr) oder FAILED(hr) |
Re: Vista/Win7 Aero Farbe auslesen
Delphi-Quellcode:
wie sieht den das aus mach doch einfach
// Überprüfen ob die RGB-Werte zulässig sind
if r < 0 then r := 0; if g < 0 then g := 0; if b < 0 then b := 0; if r > 255 then r := 255; if g > 255 then g := 255; if b > 255 then b := 255;
Delphi-Quellcode:
Dank Inlining ist das genau so schnell, und sieht irgendwie hübscher aus ;)
// Überprüfen ob die RGB-Werte zulässig sind
r := min(255, max(0, r)); g := min(255, max(0, g)); b := min(255, max(0, b)); |
Re: Vista/Win7 Aero Farbe auslesen
Ich finde, man sollte die Windows Version überhaupt nicht prüfen.
Das Gleiche gilt auch für die Unit DWMApi. Die Funktion IniDWMFuncs sollte eigentlich so aussehen:
Delphi-Quellcode:
Ohne die Windows-Version ist es viel einfacher und kompatibler.
function InitDWMFuncs: HRESULT;
begin Result := S_FALSE; hDWMDLL := LoadLibrary('dwmapi.dll'); if hDWMDLL <> 0 then begin @DwmIsCompositionEnabled := GetProcAddress(hDWMDLL, 'DwmIsCompositionEnabled'); @DwmExtendFrameIntoClientArea := GetProcAddress(hDWMDLL, 'DwmExtendFrameIntoClientArea'); @DwmEnableBlurBehindWindow := GetProcAddress(hDWMDLL, 'DwmEnableBlurBehindWindow'); @DwmDefWindowProc:= GetProcAddress(hDWMDLL, 'DwmDefWindowProc'); @DwmGetColorizationColor:= GetProcAddress(hDWMDLL, 'DwmGetColorizationColor'); @DwmEnableComposition:= GetProcAddress(hDWMDLL, 'DwmEnableComposition'); if Assigned(@DwmIsCompositionEnabled) and .... Assigned(@DwmEnableComposition) then // DLL konnte geladen werden und alle Funktionen sind verfügbar Result := S_OK else UnloadDWMFuncs; end; end; Vielleicht ist die DLL ja irgendwann auch mal unter Windows XP verfügbar. (ich weiss, sehr unwahrscheinlich) Fazit: nicht die Windows Version prüfen, sondern prüfen ob eine bestimmte Funktionalität oder API vorhanden ist. |
Re: Vista/Win7 Aero Farbe auslesen
Nicht übel nehmen :wink: Es steckt einfach mehr Erfahrung dahinter.
Die Unit ist in JEDI API anders aufgebaut: ![]() |
Re: Vista/Win7 Aero Farbe auslesen
Tatsächlich. Habe mir die Unit der JEDI API nun auch angeschaut. Damit ist die "dwmapi"-Unit ja relativ überflüssig...
Trotzdem danke für das Feedback und die Anmerkungen. PS: Ich nehm das schon nicht übel, keine Angst :wink: |
Re: Vista/Win7 Aero Farbe auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
See attached image: left color is from DwmGetColorizationParameters() and is valid, right color is from DwmGetColorizationColor() and your formula and is not valid. How to get valid color with DwmGetColorizationColor()?
|
AW: Vista/Win7 Aero Farbe auslesen
Maybe you can read the color from registry:
HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM\ --> ColorizationColor Example: 0xd9000000 d9 = Color intensity / strength / Alpha 000000 = Color hex (like html color) |
AW: Vista/Win7 Aero Farbe auslesen
Keine ahnung was der macht das die Farben bei ihm verändert werden. (Oder nicht stimmen)
Er soll dafür sorgen das sein Rect der bei ihm transparent werden soll auch im Paint Event mit der richtigen Farbe gefüllt wird. FillRectangle >= Ganzes Fenster FillRegion >= Oder Fenster Region mit Schwarz füllen. Dieser bereich wird dann zu Glas. Sind hier abweichungen dann verändert es die Farbe. Opaque Fenster bzw. bereiche liefern immer die Falsche Farbe diese sollte er also erstmal nach Aero umlegen also Bereich mit Schwarz füllen dann Aero darauf anwenden und schon stimmen auch die Farben. Und einem Shape ARGB zuweisen geht das überhaupt? Zusatz: DwmGetColorizationColor ist nicht zuverläßig.. Zitat:
![]() Das Sample ist also OK! Vorrausgesetzt man versucht nicht die Farben auf einer Undurchsichtigen Oberfläsche zu rendern. (siehe Shape) gruss |
Re: Vista/Win7 Aero Farbe auslesen
Ok, if sample is ok, so how to get color set up in Personalization, but in documented way (mean without undocumented functions or registry)?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 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