Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Vista/Win7 Aero Farbe auslesen (https://www.delphipraxis.net/147316-vista-win7-aero-farbe-auslesen.html)

Culxxaw 5. Feb 2010 15:52


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 hier zu finden.

Um die Windows Aero Farbe auszulesen:
Delphi-Quellcode:
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;
Über die Message WM_DWMCOLORIZATIONCOLORCHANGED ist es möglich ein Ereignis bei der Veränderung der Aero-Farbe auszulösen.

Ein Beispielprojekt, in dem sowohl die Message WM_DWMCOLORIZATIONCOLORCHANGED, als auch die Function GetAeroColor angewendet werden, liegt bei.

Links zum MSDN:
DwmGetColorizationColor Function
WM_DWMCOLORIZATIONCOLORCHANGED Notification

Über ein Feedback würde ich mich sehr freuen. :wink:

Dezipaitor 5. Feb 2010 16:14

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)

Corpsman 5. Feb 2010 17:16

Re: Vista/Win7 Aero Farbe auslesen
 
Delphi-Quellcode:
// Ü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;
wie sieht den das aus mach doch einfach

Delphi-Quellcode:
// Ü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));
Dank Inlining ist das genau so schnell, und sieht irgendwie hübscher aus ;)

shmia 5. Feb 2010 17:29

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:
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;
Ohne die Windows-Version ist es viel einfacher und kompatibler.
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.

Dezipaitor 5. Feb 2010 18:22

Re: Vista/Win7 Aero Farbe auslesen
 
Nicht übel nehmen :wink: Es steckt einfach mehr Erfahrung dahinter.

Die Unit ist in JEDI API anders aufgebaut:
https://jedi-apilib.svn.sourceforge..../JwaDwmapi.pas

Culxxaw 7. Feb 2010 14:54

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:

WojTec 21. Jul 2012 09:11

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()?

Andreas L. 21. Jul 2012 10:44

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)

EWeiss 21. Jul 2012 10:54

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:

DwmGetColorizationColor is completely unusable for applications attempting to apply the current color onto an opaque surface.
To workaround this, you have two options:
Opaque Surface rendering

Das Sample ist also OK! Vorrausgesetzt man versucht nicht die Farben
auf einer Undurchsichtigen Oberfläsche zu rendern. (siehe Shape)


gruss

WojTec 21. Jul 2012 13:30

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 19:12 Uhr.
Seite 1 von 2  1 2      

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