Как сделать скриншот для прозрачного безрамного окна QT? - PullRequest
0 голосов
/ 28 апреля 2018

Флаг и атрибут окна 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 . Это помещает целевую верхнюю часть окна и делает черное окно назад. И сделайте скриншот для отображения в диапазоне целевого окна.

Я не хочу влиять на целевую программу. Есть ли другие варианты?

...