Теперь как считать весь экран в виндоус в буфер обмена оказывается тоже совсем не сложно:
#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();
}
Таким образом оказывается, что никто не запрещает считывать содержание всего экрана в виндоус в любой момент.
