original Window Farben auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Varistor
Beiträge: 18
Registriert: 12.10.2004 21:38
Wohnort: Schwerin

Re: original Window Farben auslesen

Beitrag von Varistor »

Danke, Chi für deinen Code. Unter Windows 10 funktioniert es bei mir tadellos. Den Schlüssel: #HKEY_CURRENT_USER, "Software\Microsoft\Windows\DWM", "AccentColorInactive" gibt es bei mir allerdings nicht. Unter Windows 8 bzw. 8.1 läuft es nicht, weil es beide von deinen Programm ausgelesenen Schlüssel gar nicht gibt.

Dank auch an Mijikai ! Wahnsinns-Arbeit ! Und sieht eigentlich aus, als ob es funzt. Läuft allerdings bei mir unter Win 8, 8.1 und Win 10 nicht - das Fenster ist Schwarz.

Ich hoffe, dass beide Programme auch von anderen getestet werden um mal weitere Ergebnisse zu erfahren...
Benutzeravatar
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria

Re: original Window Farben auslesen

Beitrag von chi »

Varistor hat geschrieben: 31.08.2021 20:58 Den Schlüssel: #HKEY_CURRENT_USER, "Software\Microsoft\Windows\DWM", "AccentColorInactive" gibt es bei mir allerdings nicht.
Dann hast du wohl ein weißes inaktives Window... Du kannst den Key auch selber anlegen und eine beliebige Farbe wählen.
Varistor hat geschrieben: 31.08.2021 20:58 Unter Windows 8 bzw. 8.1 läuft es nicht, weil es beide von deinen Programm ausgelesenen Schlüssel gar nicht gibt.
Hab nur unter Win10 (VM) getestet. Vielleicht hilft dir folgender Code weiter:

Code: Alles auswählen

Procedure RegReadDWord(section, path$, key$)
  value=-1 : datasize.l=4 ; 4 bytes = 32 bits (long).
  If RegOpenKeyEx_(section, path$, 0, #KEY_READ, @tmp) = #ERROR_SUCCESS
    If RegQueryValueEx_(tmp, key$, 0, 0, @value, @datasize) <> #ERROR_SUCCESS : value=-1 : EndIf
    RegCloseKey_(tmp)
  EndIf
  ProcedureReturn value
EndProcedure

active = RegReadDWord(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\DWM", "ColorizationColor") & $FFFFFFFF

OpenWindow(0, 0, 0, 800, 500, "", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered)
SetWindowColor(0, RGB(Blue(active), Green(active), Red(active)))
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
Funktioniert bei mir auch unter Win8.1, allerdings muss man Red und Blue vertauschen.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: original Window Farben auslesen

Beitrag von Mijikai »

Hier nochmal der Code mit der Registry Variante (wie Chi's) mit Farb-Korrektur (getestet unter Windows 10).

Code: Alles auswählen

EnableExplicit

Procedure.i GetColorizationColor(*Color)
  Protected hkey.i
  Protected length.i
  Protected color.i
  Protected color_balance.i
  Protected color_r.d
  Protected color_g.d
  Protected color_b.d
  If RegOpenKeyEx_(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\DWM",#Null,#KEY_READ,@hkey) = #ERROR_SUCCESS
    length = 4
    If RegQueryValueEx_(hkey,"ColorizationColor",#Null,#Null,@color,@length) = #ERROR_SUCCESS
      If RegQueryValueEx_(hkey,"ColorizationColorBalance",#Null,#Null,@color_balance,@length) = #ERROR_SUCCESS
        RegCloseKey_(hkey)
        color_balance = 100 - color_balance
        length = (color >> 16) & $FF
        color_r = Round(length + (127 - length) * color_balance / 100.0,#PB_Round_Nearest)
        length = (color >> 8) & $FF
        color_g = Round(length + (127 - length) * color_balance / 100.0,#PB_Round_Nearest)
        length = color & $FF
        color_b = Round(length + (127 - length) * color_balance / 100.0,#PB_Round_Nearest)
        If color_r > 255.0
          color_r = 255.0
        EndIf
        If color_g > 255.0
          color_g = 255.0
        EndIf
        If color_b > 255.0
          color_b = 255.0
        EndIf
        color = RGB(color_r,color_g,color_b)
        CopyMemory(@color,*Color,4)
        ProcedureReturn #True
      EndIf  
    EndIf
    RegCloseKey_(hkey)  
  EndIf  
  ProcedureReturn #False
EndProcedure

Procedure.i Main()
  Protected color.i
  If OpenWindow(0,0,0,320,320,#Null$,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Tool)
    GetColorizationColor(@color)
    SetWindowColor(0,color)
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Break
      EndSelect
    ForEver
    CloseWindow(0)  
  EndIf  
  ProcedureReturn #Null
EndProcedure

Main()

End
Zuletzt geändert von Mijikai am 31.08.2021 22:51, insgesamt 1-mal geändert.
Benutzeravatar
Varistor
Beiträge: 18
Registriert: 12.10.2004 21:38
Wohnort: Schwerin

Re: original Window Farben auslesen

Beitrag von Varistor »

Leider sind auch hier die Farben nicht richtig. Das ist ja eben das Problem mit der dwmapi. In die Registrierung werden andere Werte geschrieben als mit dem Aufruf von "DwmGetColorizationColor" angezeigt werden. Und beide ergeben eine falsche Farbe. Daher hatte ich die große Hoffnung mit dem Code von Mijikai, weil dort die Korrekturwerte berücksichtigt werden.
Wie es scheint, bleibt die Farbgebung ein Geheimnis von Microsoft. Na ja, warum sollten wir in PB das schaffen, wo sich schon so viele in anderen Programmiersprachen an diesem Problem versucht haben....
Benutzeravatar
Varistor
Beiträge: 18
Registriert: 12.10.2004 21:38
Wohnort: Schwerin

Re: original Window Farben auslesen

Beitrag von Varistor »

Habe eben noch noch den Code von Mijikai getestet und läuft ! WENN man zu dem errechneten Color-Wert jeweils 10 da zu zählt. Also:
color = RGB(color_r+10,color_g+10,color_b+10)

Dann stimmt die Farbe !

Was für ein Akt, um an so simple Sachen wie die Farbe einer Titelleiste zu kommen :roll:
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: original Window Farben auslesen

Beitrag von Mijikai »

Versteh nicht wieso es da keine vernünftige Schnittstelle gibt und viele APIs noch undokumentiert sind.
Benutzeravatar
Varistor
Beiträge: 18
Registriert: 12.10.2004 21:38
Wohnort: Schwerin

Re: original Window Farben auslesen

Beitrag von Varistor »

Na ja...Microsoft eben. Es soll eben nicht jeder kleine Programmierer deren Zeug nachahmen können. Und wenn Windows 11 kommt, ist bestimmt alles noch...schlimmer.
Antworten