質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

588閲覧

ウィンドウの透明度を取得したい

buuuu14

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/09/09 21:17

こんにちは

私は今、ウィンドウの透明度もキャプチャできるソフトを開発しています。
ですが、ソフトのメイン機能であるウィンドウの透明度を取得できなくて困っています。

ウィンドウハンドルから、ウィンドウのアルファチャンネルの画像を取得する方法は何かないでしょうか?

私が言っているのはSetLayeredWindowAttributes関数で一様に透明化されたウィンドウではなく、
たとえばWindows 7のタイトルバーのような、UpdateLayeredWindow関数で透明化されたウィンドウのことです。

この分野に関してのWin32APIについていろいろ調べたのですが、
あまり自分の望んでいるような記事が見当たらなかったためここで質問させていただきます。

また、これは私の憶測なのですが、そういったウィンドウには
アルファチャンネルのようなものがデバイスコンテキストに追加されると思っています。

何か透明度を取得する関数はないのでしょうか?

回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

通常の方法では無理です。

また、これは私の憶測なのですが、そういったウィンドウには
アルファチャンネルのようなものがデバイスコンテキストに追加されると思っています。

ちょっと違います。UpdateLayeredWindowは、ユーザーが用意したアルファチャンネル付きの画像を「そのまま」画面に表示させます。UpdateLayeredWindowの引数hdcSrcがそれです。メモリデバイスコンテキストにアルファチャンネル付きのビットマップを描画し、それをUpdateLayeredWindowに渡すと、それがそのまま画面に表示されるという仕組みです(したがって、ウィンドウを構成するUIパーツはすべて自力で描画する必要があります)。

つまり、

何か透明度を取得する関数はないのでしょうか?

それを取得するには画面に表示される画像データそのものを取得する必要があるわけですが、それができれば苦労はないわけで……。

ちなみに、

たとえばWindows 7のタイトルバーのような、UpdateLayeredWindow関数で透明化されたウィンドウのことです。

Aeroの半透明タイトルバーのことだと思いますが、原理は似ていますがUpdateLayeredWindowを使っているわけではありません。DWM(デスクトップウィンドウマネージャー)内部での描画処理なので、ユーザーが介入することは難しいと思います。

最初に「通常の方法では無理」と書きましたが、では通常ではない方法があるのかというと、DLLインジェクションやらグローバルフックやらでAPIフックを噛ましてUpdateLayeredWindowを横取りし、hdcSrcで渡された画像データをこっそりコピーしてプロセス間通信で受け渡す、という方法が考えられなくもないです。ただし、UpdateLayeredWindowはWM_PAINTと違って任意のタイミングで自発的に呼び出すものなので、外部からは思い通りのタイミングで呼び出してくれないかもしれません。


追記

書いた後で思い出したのですが、DWMのAPIを使えばできるかもしれません。だいぶ前に何かの調べ物をしていたときに、DWMにはウィンドウに表示されている画像を取得する手段があったような記憶がありますが、すっかり忘れています。
私自身は試したことがないので詳しい説明は別の方にお任せします。

投稿2017/09/10 02:10

編集2017/09/10 02:49
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

buuuu14

2017/09/10 04:10

回答ありがとうございます。 やはり通常の方法では無理でした。。。 概念や新しい単語がわかっただけでも、調べ方がわかってくるのでとても嬉しいです。 また調べてみることにします。
catsforepaw

2017/09/10 04:17

ずばりこれだ、というものを提示できなくてすみません。「透明度の取得」に気をとられていろいろ難しいことを書いてしまいましたが、もし目的がウィンドウ内の画像キャプチャーのようなことでしたら、DWMのAPIでできたはずです。「DWM」「キャプチャー」などをキーワードに調べれば、いろいろ出てくると思います。
buuuu14

2017/09/10 12:33

「DWM」「キャプチャー」で調べたところ、たくさんのサンプルが見つかり、あっさり解決しました 十分ズバリです ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問