HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0917
京浜東北線・根岸線Windows10 のテーマ色を取得するには?10解決


京浜東北線・根岸線

リンク

2020/9/17(Thu) 15:37:29|NO.91388

Windows10のテーマ色(タイトルバーやシャットダウン画面に出る色)の取得することって出来ますか?
よろしくお願いいたします。



この記事に返信する


TOMATO

リンク

2020/9/17(Thu) 16:32:56|NO.91389

DwmGetColorizationColor() あたりで取得できるんじゃないかなぁ。
試していませんが。

クラシック デスクトップ アプリの Windows テーマ追従
http://grabacr.net/archives/6671



こいる

リンク

2020/9/19(Sat) 12:09:11|NO.91399

アクセントカラーのことかな。

TOMATOさんがおっしゃっているDwmGetColorizationColor関数を使い、
実際に取得してみたので、参考にどうぞ。

#uselib "dwmapi.dll" #func DwmGetColorizationColor "DwmGetColorizationColor" sptr,sptr // 取得 (0xAARRGGBB形式の16進数) dim clr dim opaque DwmGetColorizationColor varptr(clr), varptr(opaque) // RGB値に変換 r = clr>>16 & $FF g = clr>>8 & $FF b = clr & $FF color r,g,b boxf pos 5,5 color 255,255,255 mes strf("R:%d \nG:%d \nB:%d", r, g, b)



京浜東北線・根岸線

リンク

2020/9/22(Tue) 11:02:45|NO.91423

返信が遅れました
ありがとうございます、テーマカラー取得できました



リンク

2021/1/28(Thu) 17:43:40|NO.92171

ついでで質問させて頂きたい。
こいるさんのclr>>16 & $FFのところですが
8ビットまでおとしているのになぜまた&演算する必要があるの
でしょうか?



沢渡

リンク

2021/1/28(Thu) 19:36:34|NO.92174

こいるさんではありませんが、
DwmGetColorizationColorで取得できるアクセントカラーは0xAARRGGBB形式ですが、
この"AA"(透明度)の部分を切り捨てる必要があるからでしょう。
たとえば以下のコードを実行した場合、私の環境ですとrは0になりますが、
r0は-7424になってしまいます。

#uselib "dwmapi.dll" #func DwmGetColorizationColor "DwmGetColorizationColor" sptr,sptr // 取得 (0xAARRGGBB形式の16進数) dim clr dim opaque DwmGetColorizationColor varptr(clr), varptr(opaque) r0 = clr>>16 //もし下位8ビットをandで抽出しなかったら r = clr>>16 & $FF mes r0 mes r



?

リンク

2021/1/29(Fri) 17:52:12|NO.92175

沢渡様ありがとうございます。
納得しました。
-7424という数値はよくわからないのですが0xAARRGGBBの最大数はマイナス値ですか?
私のパソコンでは5132と12が表示されました。



沢渡

リンク

2021/1/29(Fri) 18:04:44|NO.92176

32ビット整数は一番左のビットが符号ビットで、
このビットが1だとマイナスとして扱われます。
そしてHSPの右ビットシフトは「算術シフト」と言って、
一番左のビットが1の場合、右ビットシフトで左にできたスペースは
すべて1で埋められます。
その結果「AA」の部分の内容によっては(上のコードで言うところの)r0が
マイナスになることもあり得ます。
AとRとGとBをすべて"& $FF"した場合は、次のようになります。

#uselib "dwmapi.dll" #func DwmGetColorizationColor "DwmGetColorizationColor" sptr,sptr // 取得 (0xAARRGGBB形式の16進数) dim clr dim opaque DwmGetColorizationColor varptr(clr), varptr(opaque) a = clr>>24 & $FF r = clr>>16 & $FF g = clr>>8 & $FF b = clr & $FF mes a mes r mes g mes b
私の環境では、aは227、rは0、gは111、bは199でした。



リンク

2021/1/30(Sat) 00:13:34|NO.92177

ありがとうございます。
透明度は$FFまでありますよね。
マイナスが入る余地はどこにありますか?



沢渡

リンク

2021/1/30(Sat) 08:58:38|NO.92178

左端のビットはマイナス符号として解釈される場合とされない場合があります。

今回の例で言いますと、私の環境でのclrの内容を
16進数($AARRGGBB形式)と10進数、そして2進数で表しますと、

16進数:$E3006FC7 10進数:-486510649 2進数:11100011 00000000 01101111 11000111
となります。
この値をmes命令でそのまま10進数形式で表示した場合は
「左端のビットはマイナス符号である」と解釈されますが、
「透明度と赤と緑と青の値を$AARRGGBB形式で表す」という用途の場合では
「左端のビットはマイナス符号である」とは解釈されません。

これを"clr>>16"で右ビットシフト(算術シフト)すると、

2進数:11111111 11111111 11100011 00000000 16進数:$FFFFE300 10進数:-7424
この通り、上位16ビットが1で埋められ、これを10進数で表したのが
NO.92174で出てきた-7424です。

そして、"& $FF"というのは「最下位の8ビットだけを残してあとは全部0にする」
という作業であり、これを実行すると、

・r 2進数:00000000 00000000 00000000 00000000 16進数:$00000000 10進数:0
このようにして$AARRGGBB形式の16進数からRRの部分を取り出しています。

同様にして、AAやGGやBBを$E3006FC7から取り出すと、

・a 2進数:00000000 00000000 00000000 11100011 16進数:$000000E3 10進数:227 ・g 2進数:00000000 00000000 00000000 01101111 16進数:$0000006F 10進数:111 ・b 2進数:00000000 00000000 00000000 11000111 16進数:$000000C7 10進数:199



リンク

2021/1/30(Sat) 13:04:22|NO.92180

そういうことだったのですね。謎が解けました。
実に奥が深い。
沢渡様、詳細に教えていただきありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.