を使用して2つ目のデスクトップを作成しましたが、CreateDesktop
切り替えません。また、Explorer.exeやWinrar.exeのようないくつかのプロセスを作成しました。次に、現在のデスクトップのスクリーンショットをクリップボードに取り込むコードがあります。CreateDesktopとScreenshotはどちらも機能しますが、その新しいデスクトップまたはウィンドウのスクリーンショットは黒いビットマップを返します。
これは、現在のデスクトップを返すデスクトップのウィンドウのスクリーンショットです。
// hwnd is handle to winrar or ... created in a new desktop retrieved by EnumDesktopWindow
RECT rc;
GetClientRect(hwnd, &rc);
const HDC hScreenDC = GetDC(nullptr);
const HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
const int width = GetDeviceCaps(hScreenDC, HORZRES);
const int height = GetDeviceCaps(hScreenDC, VERTRES);
const HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
HBITMAP(SelectObject(hMemoryDC, hBitmap));
BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
OpenClipboard(nullptr);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
私はこの両方のメソッドをc#で実装しましたが、同じことがそこで起こります。
次のような優れたリソースがあります。
createdesktopapiを使用して作成されたデスクトップのスクリーンショットを撮ります
C#– VISTA DWMを使用したスクリーンキャプチャ(SHARED DIRECT3D SURFACE)
WM_PRINTメッセージを使用したウィンドウコンテンツのキャプチャ
別のデスクトップから画面をキャプチャする方法は?(CreateDesktop)
また、これは死んだトピックのようなものであり、新しい記事、説明、または解決策はありません。
私はそれらのほとんどを読みましたが、運がありません、これは私が思う最も近い試みでした。また、言語は私にとって重要ではありません:C#、C ++、Pythonまたは...。
私は解決策を見つけました、それは面白いですが完璧ではありません、ただ私のニーズを解決します。
後にCreateDesktop
呼び出すことでOpenDesktop
、その後SetThreadDesktop
のスクリーンショットコードを使用して、あなたがCreateDesktop、その中にExplorer.exeを作成するためにも必要はありません内部で作成されたウィンドウのスクリーンショットを取得し、あなただけのウィンドウをしたい場合:
CreateDesktopW(L"NewDesktop"); // CreateDesktop code here. This is my function
const HDESK Handle = OpenDesktopW(L"NewDesktop", 0, 0, GENERIC_ALL);
SetThreadDesktop(Handle);
// Above ScreenShot code here ...
スクリーンショットコードにはPrintWindow
:が必要です。
RECT rc;
GetClientRect(hwnd, &rc);
const HDC hScreenDC = GetDC(nullptr);
const HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
const int width = GetDeviceCaps(hScreenDC, HORZRES);
const int height = GetDeviceCaps(hScreenDC, VERTRES);
const HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
HBITMAP(SelectObject(hMemoryDC, hBitmap));
BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
/// ADDED CODE
PrintWindow(hWnd, hMemoryDC, PW_CLIENTONLY);
///
OpenClipboard(nullptr);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
私は、非アクティブなデスクトップ内のwinrar.exeウィンドウを操作しました。これを試してから貼り付けてペイントすると、結果を確認できます。
1つだけあります。スクリーンショットのビットマップの領域全体が黒ですが、必要なウィンドウハンドルを除いて、私は問題ありません。私はすべてのウィンドウを下から上に順番に処理してからそれらを混ぜ合わせる必要があると思います。
これへのすべての追加はありがたいです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加