DOBON.NET DOBON.NETプログラミング掲示板過去ログ

XPとVistaのレイヤーウィンドウの振る舞いの違いについて

環境/言語:[XP / C# / Framework 2.0]
分類:[.NET]

何時もお世話になっております、まこと と申します。

以前から開発しております拡大鏡プログラムに絡んで、Windows Vistaにおける
レイヤーウィンドウの振る舞い(?)について教えて頂きたい事が有ります。

現在、自身(拡大画像を表示するフォーム)の背面の画像をキャプチャする為に
WS_EX_LAYEREDフラグをウィンドウの拡張スタイルに追加し、その上で
SetLayeredWindowAttributes(this.Handle, 0, 255, LWA_ALPHA)として不透過
のレイヤーウィンドウを作成しております。

この状態でGetDC(0)→BitBlt(〜, SRCCOPY)とすると、Windows XP上では自身の
ウィンドウがキャプチャされず、背面の画像のみを取得する事が出来ました。

しかしWindows Vista上で実行しますと、BitBltのラスタオペレーションに
CAPTUREBLTを指定していないにも拘らず、レイヤー化された自身の画像を取得
してしまいます。
※キャプチャ位置をズラすと「合わせ鏡」の様に表示されます…

フォームの透過率を100%(透明)として、更にSetLayeredWindowAttributesでは
なく、UpdateLayeredWindowを拡大画像を表示する様にしても、結局自身を
キャプチャしてしまい、背面の画像を取得する事が出来ません。

Vista上で動く拡大鏡ソフトも幾つか存在する為、"技術的に不可能"と言う訳では
ないと思うのですが、どなたかVistaでも通用する背面画像の取得方法をご存じ
ありませんでしょうか?

以上 宜しくお願い致します。
言語がC#になっているけれども、C++での話かな?

本筋のレイヤードウィンドウに関しては何とも言えないけれども、Vistaでは拡大鏡で新しいAPIが提供されているらしい。
http://msdn.microsoft.com/en-us/library/ms692402.aspx
■No24012に返信(Azuleanさんの記事)
> 言語がC#になっているけれども、C++での話かな?
>
> 本筋のレイヤードウィンドウに関しては何とも言えないけれども、Vistaでは拡大鏡で新しいAPIが提供されているらしい。
> http://msdn.microsoft.com/en-us/library/ms692402.aspx

Azuleanさん、返信ありがとうございます。

既存のAPIでなんとか実装できないものかと試行錯誤していたのですが
専用のAPIが実装されたとあれば、そちらを使用するのが道理ですよね。

現在Vistaでの開発環境が無い為に、新しいAPI郡を試してみる事ができ
ないのですが、開発環境が用意できた暁には試してみたいと思います。

本件については一先ず「Magnification APIで実装しなおす」と言う結論
をもって終了させて頂きます。

ありがとうございましたm(__)m


PS. 使用している言語はC#ですが、処理の高速化を目的に一部の処理を
  APIに置き換えている為、.NETらしからぬプログラムになってます(^^;
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板