Флаг и атрибут окна Qt Window устанавливают:
setWindowFlag(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
Коды скриншотов:
HDC hdc = GetDC(hwnd);
if (!hdc)
{
LOGE << "Get window dc failed. Code - " << GetLastError();
return "";
}
SCOPE_GUARD([hwnd, hdc] {
ReleaseDC(hwnd, hdc);
});
//get window size
RECT clientRect;
if (hwnd)
{
GetClientRect(hwnd, &clientRect);
}
else
{
clientRect.top = 0;
clientRect.left = 0;
clientRect.right = GetSystemMetrics(SM_CXSCREEN);
clientRect.bottom = GetSystemMetrics(SM_CYSCREEN);
}
LONG rectWidth = clientRect.right - clientRect.left;
LONG rectHeith = clientRect.bottom - clientRect.top;
//create target dc
HDC dcMemory = CreateCompatibleDC(hdc);
if (!dcMemory)
{
LOGE << "Create compatible dc failed. Code - " << GetLastError();
return "";
}
SCOPE_GUARD([dcMemory] {
DeleteObject(dcMemory);
});
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, rectWidth, rectHeith);
if (!hBitmap)
{
LOGE << "Create compatible bitmap failed. Code - " << GetLastError();
return "";
}
SCOPE_GUARD([hBitmap] {
DeleteObject(hBitmap);
});
//select and print
{
HGDIOBJ hOldBitmap = SelectObject(dcMemory, hBitmap);
SCOPE_GUARD([dcMemory, hOldBitmap] {
SelectObject(dcMemory, hOldBitmap);
});
if (!BitBlt(dcMemory, 0, 0, rectWidth, rectHeith, hdc, 0, 0, SRCCOPY))
{
LOGE << "Copy data from DC failed. Code - " << GetLastError();
return "";
}
}
Наконец, я получил черное изображение.
Я нашел Aeroshot . Это помещает целевую верхнюю часть окна и делает черное окно назад. И сделайте скриншот для отображения в диапазоне целевого окна.
Я не хочу влиять на целевую программу. Есть ли другие варианты?