通常の方法では無理です。
また、これは私の憶測なのですが、そういったウィンドウには
アルファチャンネルのようなものがデバイスコンテキストに追加されると思っています。
ちょっと違います。UpdateLayeredWindowは、ユーザーが用意したアルファチャンネル付きの画像を「そのまま」画面に表示させます。UpdateLayeredWindowの引数hdcSrcがそれです。メモリデバイスコンテキストにアルファチャンネル付きのビットマップを描画し、それをUpdateLayeredWindowに渡すと、それがそのまま画面に表示されるという仕組みです(したがって、ウィンドウを構成するUIパーツはすべて自力で描画する必要があります)。
つまり、
何か透明度を取得する関数はないのでしょうか?
それを取得するには画面に表示される画像データそのものを取得する必要があるわけですが、それができれば苦労はないわけで……。
ちなみに、
たとえばWindows 7のタイトルバーのような、UpdateLayeredWindow関数で透明化されたウィンドウのことです。
Aeroの半透明タイトルバーのことだと思いますが、原理は似ていますがUpdateLayeredWindowを使っているわけではありません。DWM(デスクトップウィンドウマネージャー)内部での描画処理なので、ユーザーが介入することは難しいと思います。
最初に「通常の方法では無理」と書きましたが、では通常ではない方法があるのかというと、DLLインジェクションやらグローバルフックやらでAPIフックを噛ましてUpdateLayeredWindowを横取りし、hdcSrcで渡された画像データをこっそりコピーしてプロセス間通信で受け渡す、という方法が考えられなくもないです。ただし、UpdateLayeredWindowはWM_PAINTと違って任意のタイミングで自発的に呼び出すものなので、外部からは思い通りのタイミングで呼び出してくれないかもしれません。
追記
書いた後で思い出したのですが、DWMのAPIを使えばできるかもしれません。だいぶ前に何かの調べ物をしていたときに、DWMにはウィンドウに表示されている画像を取得する手段があったような記憶がありますが、すっかり忘れています。
私自身は試したことがないので詳しい説明は別の方にお任せします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/10 04:10
2017/09/10 04:17
2017/09/10 12:33