Windows 10 で特定のウィンドウを取得しようとしています。API に慣れるために、MSDN の記事をいくつか読みました。私の目標は、その上にいくつかのウィンドウがある場合でも、いくつかの特定のウィンドウを取得することです (OS X と同等CGWindowList API
)。したがって、2 つのウィンドウがある場合: A
and B
、および windows がB
部分的に window に重なっている場合、ウィンドウを部分的に覆うウィンドウをキャプチャせずに、ウィンドウの内容A
をキャプチャできるようにしたいと考えています。A
B
このリンクによると、画面をキャプチャする 5 つの異なる方法があります。それらが正しいことを理解していれば、それらのほとんどは画面上の一部の領域のみをキャプチャできます。つまり、ウィンドウを区別しません。特定のウィンドウを取得できる唯一の API は、「古いスタンバイ、GDI」です。
関数を使用して Windows のデバイス コンテキストを取得GetWindowDC()
し、互換性のあるビットマップを作成してから、ビット ブロック転送 ( BitBlt()
) を使用しようとしました。ただし、必ずしも期待どおりに機能するとは限らないようです。
Windows 10 でいくつかの問題に気付きました (他のオペレーティング システムではテストしていません)。
- 通常、ウィンドウのタイトル バーはキャプチャされません。メモ帳を開いてウィンドウをキャプチャしようとしましたが、完全にはキャプチャされず、スクロール バーの一部とタイトル バーがキャプチャされませんでした。メモ帳の子ウィンドウをキャプチャしようとしましたが、期待どおりに動作しませんでした。さらに、いくつかの子ウィンドウは座標が間違っているようです (
msctls_statusbar32msctls_statusbar32
メモ帳の子ウィンドウは、実際の幅の 3 倍の幅を持っていました)。窓)。 - 一部のアプリはまったくキャプチャされません。たとえば、「写真」、「電卓」、「設定」などのアプリケーションは、そのアプローチではキャプチャされません。それらをキャプチャしようとすると、黒いビットマップが表示されます。そのようなウィンドウをキャプチャできる API が必要です。たとえば、TeamViewer はそれらのウィンドウをキャプチャできます。そのようなウィンドウはすべて
ApplicationFrameHost.exe
プロセスによってレンダリングされるようです。
これらの問題を解決する方法を知っている人はいますか?