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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0817
チャーくんAeroの取得した色と実際の色…4解決


チャーくん

リンク

2015/8/17(Mon) 19:05:11|NO.70847

Windows 10の環境でDWM APIでAeroの色を取得したいのですが…

#uselib "dwmapi.dll" #func DwmGetColorizationColor "DwmGetColorizationColor" int,int Colorization = 0 OpaqueBlend = 0 DwmGetColorizationColor varptr(Colorization),varptr(OpaqueBlend) alpha = (Colorization >> 24) & $ff red = (Colorization >> 16) & $ff green = (Colorization >> 8) & $ff blue = Colorization & $ff color red,green,blue boxf
これを実行すると、一見Aeroで設定されている色っぽいのですが…
ウィンドウの枠と見比べると、ビミョーに色が違います。
ちなみに、Windows7でも違った記憶があります。
他の環境では、どうなのでしょうか?



この記事に返信する


チャーくん

リンク

2015/8/17(Mon) 19:11:36|NO.70848

ちなみに、Windows 10のアプリ「Groove ミュージック」で確認したところ、
HSPで実行した結果と同じ色でした。
…ということは、設定された色はこの色で合っていて、
DWMがこの色に手を加えてウィンドウの枠に色にしている…
…ということかもしれません。



b

リンク

2015/8/17(Mon) 19:30:21|NO.70850

たぶんこんな面倒なことしなくてもできるはずですが..
参考:http://chokuto.ifdef.jp/advanced/capturewindow.html


#module #uselib "user32.dll" #cfunc GetDC "GetDC" int #cfunc GetWindowDC "GetWindowDC" int #func ReleaseDC "ReleaseDC" int,int #cfunc GetForegroundWindow "GetForegroundWindow" #cfunc GetDesktopWindow "GetDesktopWindow" #func GetWindowRect "GetWindowRect" int,int #func GetClientRect "GetClientRect" int,int #uselib "gdi32.dll" #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 #deffunc CaptureWindow int hwndTarget, int clientOnly ; ウィンドウのサイズ取得 dim rect, 4 ; RECT構造体 if clientOnly { GetClientRect hwndTarget, varptr(rect) } else { GetWindowRect hwndTarget, varptr(rect) } if stat == 0 { return 1 ; エラー発生時 stat = 1 } sx = rect(2) - rect(0) sy = rect(3) - rect(1) ; 現在の描画先バッファウィンドウをコピー先として初期化 buffer ginfo_sel, sx, sy, 0 ; デバイスコンテキストのハンドル取得 if clientOnly { hdcTarget = GetDC(hwndTarget) } else { hdcTarget = GetWindowDC(hwndTarget) } ; 画像をコピー BitBlt hdc, 0, 0, sx, sy, hdcTarget, 0, 0, SRCCOPY | CAPTUREBLT ; デバイスコンテキスト解放 ReleaseDC hwndTarget, hdcTarget return 0 ; 正常終了時 stat = 0 ; ======== アクティブウィンドウのキャプチャ ======== #deffunc CaptureActiveWindow int clientOnly ; アクティブウィンドウのハンドルを取得してウィンドウキャプチャ CaptureWindow GetForegroundWindow(), clientOnly return ; ======== デスクトップ画面のキャプチャ ======== #deffunc CaptureDesktopScreen ; デスクトップウィンドウのハンドルを取得してウィンドウキャプチャ CaptureWindow GetDesktopWindow() return #global *capture ; 押されたボタンのオブジェクトIDを取得 pressedButtonId = stat ; ===== 画面のキャプチャ ===== gsel 0, 1 ; ウィンドウをいったん消す buffer 2, 1, 1 ; コピー用バッファ画面(サイズはダミー、とりあえず1×1) CaptureActiveWindow 0 pget 10,5 boxf gsel 0,1 celput 2 stop



スペース

リンク

2015/8/17(Mon) 19:37:07|NO.70851

windows10は持っているのですが今すぐ確認できないので推測ですが、
windows10のウィンドウの縁も微妙に半透明だからではないでしょうか?



チャーくん

リンク

2015/8/18(Tue) 14:17:22|NO.70886

b さん
DWM APIを使わずに、実際のウィンドウの枠をキャプチャして取得する方法ですね。
ですが、ウィンドウの表示アニメーションで取得するまでに少し時間がかかったり、
負荷がかかってウィンドウの表示が遅くなったり、
アクティブにされなかったり(タスクバーのボタンが点滅する状態)すると
違う色が取得されるで、あまり現実的ではないようです。

スペース さん
白い背景の上と黒い背景の上でRGB値を比較しましたが、変化がなかったので
完全に不透明になってる感じです。

なんでこんなややこしいことを…
とりあえず、設定された色をちょっと変えて使っている、ということになります。

(それよりもEdgeとかメールの起動画面の色がAeroの色じゃないのが気になる…)



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