Windows 7 で使える undocumented API を使った方法。
Windows 7 の user32.dll には DwmGetDxSharedSurface() という undocumented な API があります。Vista には無いようです。
typedef BOOL WINAPI DwmGetSharedSurface(HWND hWnd, void *phShared, void *unknwon3, void *unknown4, void *unknwon5, void *unknwon6);
呼び出すと指定したウィンドウに対応するクライアント領域を表す Direct 3D テクスチャの共有ハンドルが取得できます。例によってウィンドウが隠れていようが画面からはみ出していようが問題ありません。undocumented なので使い方の分からない謎の引数がいっぱいありますが、適当なポインタを渡しておきます。もちろん見つけたのは私ではなく、ググっていたら解説を偶然見つけたのですが、なにぶんかなり前のことで、そのページのURLが分からなくなってしまいました。不覚。
これを ID3D10Device::OpenSharedResource() に渡すと 2D テクスチャ(ID3D10Texture2D を実装するオブジェクト)が取得できます。あとは適当にどうぞ。
…とまあここまではいいのですが、このテクスチャ、アルファチャンネルがなんか変です。
画面上でこうなっている IE10 に対して上の方法でクライアント領域の画像を取ると、
アルファチャンネルを解釈するとこのようになってしまいます。ブックマーク部分が明らかに異常なアルファ値になっています。
ちなみにアルファチャンネルを無視した場合はこうなります。これは GetDC(hWnd) して BitBlt() した場合と同じです。
異常なアルファ値になるのは IE に限らないようで、いろんなアプリケーションのウィンドウでこのような状態になります。せっかくアルファ値込みで取れるかと思ったのですが残念です。
まとめ
使えない(涙) というか GetDC() する方法と結果が同じなのでそれで十分。
せっかく1日潰して調べたんだけどなぁ。
その4に続く…はず。
no comment untill now