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...
original Window Farben auslesen
Re: original Window Farben auslesen
Dann hast du wohl ein weißes inaktives Window... Du kannst den Key auch selber anlegen und eine beliebige Farbe wählen.
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
Re: original Window Farben auslesen
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.
Re: original Window Farben auslesen
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....
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....
Re: original Window Farben auslesen
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
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
Re: original Window Farben auslesen
Versteh nicht wieso es da keine vernünftige Schnittstelle gibt und viele APIs noch undokumentiert sind.
Re: original Window Farben auslesen
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.