我已经使用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或...。
答案 0 :(得分:0)
我找到了解决方案,这很有趣,但并不完美,只是解决了我的需求。
在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窗口进行工作。您可以尝试此方法,然后将其粘贴以绘画以查看结果。
只有一件事,除了我想要的窗口句柄之外,屏幕快照位图的整个区域都是黑色的。我认为我应该从下到上掌握每个窗口的顺序,然后将它们混合在一起。
感谢所有对此的补充。