Я нашел решение, это интересно, но не идеально, Просто решает мои проблемы.
После 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 внутри неактивного рабочего стола.Вы можете попробовать это, а затем вставить его, чтобы нарисовать, чтобы увидеть результат.
Есть только одна вещь, вся область растрового изображения на скриншоте черная, за исключением дескриптора окна, который я хочу, и это хорошо для меня.Я думаю, что я должен получить дескриптор каждого окна снизу вверх, чтобы затем смешать их.
Все дополнения к этому приветствуются.