从另一个桌面捕获屏幕截图

时间:2019-03-09 09:03:59

标签: c++ screenshot desktop handle window-managers

我已经使用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#中实现了这两种方法,但是同样的事情在那里发生。

有很多资源,例如:

Capture screenshot of hidden desktop

take a screenshot of a desktop created using createdesktop api

C# – SCREEN CAPTURE WITH VISTA DWM (SHARED DIRECT3D SURFACE)

Window Contents Capturing using WM_PRINT Message

how to capture screen from another desktop?(CreateDesktop)

这也像一个死话题,没有新文章,解释或解决方案。

我读了其中大多数书,但没有运气,这是我认为最接近的尝试。语言对我也无关紧要:C#,C ++,Python或...。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,这很有趣,但并不完美,只是解决了我的需求。

CreateDesktop之前,先依次调用OpenDesktopSetThreadDesktop,然后使用屏幕快照代码,您将获得在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窗口进行工作。您可以尝试此方法,然后将其粘贴以绘画以查看结果。

只有一件事,除了我想要的窗口句柄之外,屏幕快照位图的整个区域都是黑色的。我认为我应该从下到上掌握每个窗口的顺序,然后将它们混合在一起。

感谢所有对此的补充。