шаг 2: получение всего скрина экрана

Теперь как считать весь экран в виндоус в буфер обмена оказывается тоже совсем не сложно:

#include <QtCore/QCoreApplication>

#define _WIN32_WINNT    0x0501        //xp

#include <windows.h>
#include <QDebug>

#pragma comment (lib, "user32"); //User32.lib
#pragma comment (lib, "gdi32"); //User32.lib

int ScreenX = 0;
int ScreenY = 0;
BYTE* ScreenData = NULL;
bool lsb = false;

int LoadScreenBytes()
{
    ScreenX = GetDeviceCaps(GetDC(0), HORZRES);
    ScreenY = GetDeviceCaps(GetDC(0), VERTRES);

    if(lsb == true)
        delete[] ScreenData;
    ScreenData = new BYTE[3*ScreenX*ScreenY];
    lsb = true;

    HDC hdc = GetDC(NULL), hdcMem = CreateCompatibleDC (hdc);

    HBITMAP hBitmap = CreateCompatibleBitmap(hdc, ScreenX, ScreenY);

    BITMAPINFOHEADER bmi = {0};
    bmi.biSize = sizeof(BITMAPINFOHEADER);
    bmi.biPlanes = 1;
    bmi.biBitCount = 24;
    bmi.biWidth = ScreenX;
    bmi.biHeight = -ScreenY;
    bmi.biCompression = BI_RGB;

    SelectObject(hdcMem, hBitmap);

    //copy to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();


    BitBlt(hdcMem, 0, 0, ScreenX, ScreenY, hdc, 0, 0, SRCCOPY);

    GetDIBits(hdc, hBitmap, 0, ScreenY, ScreenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
    DeleteObject(hBitmap);
    DeleteDC(hdcMem);
    ReleaseDC(NULL, hdc);
    return 0;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    

    LoadScreenBytes();

    return a.exec();
}

Таким образом оказывается, что никто не запрещает считывать содержание всего экрана в виндоус в любой момент.

фотка 1