AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Vista/Win7 Aero Farbe auslesen

Ein Thema von Culxxaw · begonnen am 5. Feb 2010 · letzter Beitrag vom 7. Feb 2010
Antwort Antwort
Culxxaw

Registriert seit: 21. Okt 2008
40 Beiträge
 
#1

Vista/Win7 Aero Farbe auslesen

  Alt 5. Feb 2010, 15:52
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.
Miniaturansicht angehängter Grafiken
demo_182.jpg  
Angehängte Dateien
Dateityp: zip aero_farbe_auslesen_demo_143.zip (273,5 KB, 28x aufgerufen)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.699 Beiträge
 
Delphi 7 Professional
 
#2

Re: Vista/Win7 Aero Farbe auslesen

  Alt 5. Feb 2010, 16:14
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)
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
973 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Vista/Win7 Aero Farbe auslesen

  Alt 5. Feb 2010, 17:16
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
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 3,9 mb ) aktuell ver 0.64
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.340 Beiträge
 
Delphi 5 Professional
 
#4

Re: Vista/Win7 Aero Farbe auslesen

  Alt 5. Feb 2010, 17:29
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.
Andreas
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.699 Beiträge
 
Delphi 7 Professional
 
#5

Re: Vista/Win7 Aero Farbe auslesen

  Alt 5. Feb 2010, 18:22
Nicht übel nehmen Es steckt einfach mehr Erfahrung dahinter.

Die Unit ist in JEDI API anders aufgebaut:
https://jedi-apilib.svn.sourceforge..../JwaDwmapi.pas
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Culxxaw

Registriert seit: 21. Okt 2008
40 Beiträge
 
#6

Re: Vista/Win7 Aero Farbe auslesen

  Alt 7. Feb 2010, 14:54
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2012 by Daniel R. Wolf