そのため、PIL を使用してデスクトップのスクリーンショットを取得し、pywin32 を使用してその四角形を取得し、必要な部分を切り取ることができます。ただし、必要なウィンドウの前に何かがあると、スクリーンショットが必要なアプリケーションが遮られます。アプリケーションが現在表示しているウィンドウを取得する方法はありますか? 他のウィンドウがその前にある場合でも、そのデータはどこかにあります。
7 に答える
ここの回答に作業コードを投稿しました:非アクティブウィンドウのスクリーンショット PrintWindow + win32gui。機能を利用していPrintWindow
ます。これは、非表示のウィンドウのイメージをコピーする「正しい」方法ですが、常に機能するとは限りません。WM_Print
適切なメッセージ、応答を実装するプログラムに依存します。
使用しようとしてPrintWindow
もうまくいかない場合、残りの唯一のオプションは、BitBlit
.
ショットを撮る前に、アプリケーションにフォーカスを与えることで、同じことを行いました。
shell=win32com.client.Dispatch("Wscript.Shell")
success = shell.AppActivate(app_name) # Returns true if focus given successfully.
関数を使用してこれを行う方法がありPrintWindow
ます。ウィンドウが別の面に再描画されます。
可能であれば、ウィンドウの順序を保存してから、アプリを前面に移動し、スクリーンショットを作成して、すぐに元に戻します。少し厄介なちらつきが発生する可能性がありますが、何もないよりはましかもしれません.
アプリを画面外に配置して、スクリーンショットを撮り、元に戻すことができますか?
WindowsプレビスタではなくIIRC-Aeroでは、各ウィンドウに独自のバッファーがありますが、その前に、長方形を取得する方法を使用するだけです。pywin32 が Aero をサポートしているかどうかはわかりません。