Vistaの画面キャプチャ

http://d.hatena.ne.jp/ryocotan/20071026
真っ黒い画面がキャプチャされる

Vistaでの画面キャプチャ
GetDC(GetDesktopWindow())
BitBlt(..)
ReleaseDC(..)
しかし、VistaのAero環境ではこれが使えませんでした。

私が知っているキャプチャの方法としては

GDI経由

  1. BitBlt()
  2. ミラードライバを作成する(参考: FAQ アプリケーション共有について

Direct3D経由

  1. D3DXSaveSurfaceToFile()
  2. GetBackBuffer()、D3DXLoadSurfaceFromSurface()とかでがんばる

2000とXPのドライバはほぼ一緒で、今はXPDM(Windows XP Display Driver Model)と呼んでいる。VistaのドライバはWDDMWindows Display Driver Model)。

XPだとDirect3Dの描画が例外扱い、VistaだとDirect3DがネイティブでGDIの描画がエミュレーションということらしい。
でもって自分が関知しないもの(オーバーレイとか)をキャプチャすると真っ黒(単色)になる。たぶんHDCPで保護されているコンテンツも真っ黒になるんじゃないかと思うけど試してない。

以下推測。
XPだと少なくともGDIの領域はローカルに持っていそうだけど、Vistaだとビデオ側にしか持ってない。GeForce7300はTurboCacheとか積んでて、Windowsがどこを参照したらいいかわからないからキャプチャできない。と思ったけどVistaではTurboCacheは有効になってないっぽい