Я использую эту функцию, чтобы сделать скриншот из определенного окна или целого рабочего стола, и она работает, потому что я вижу результат со вставкой в MSPaint. Но я не хочу записывать результат в *.bmp
или любой другой тип файла, я хотел сделать простой клиент VNC с нуля, отправив эти растровые данные на удаленный сервер. Могу ли я просто отправить это растровое изображение напрямую через сокет на сервер? Или я должен сначала преобразовать его в byte
или string
.
static void MyPrintWindow(HWND hWnd)
{
RECT rc;
GetWindowRect(hWnd, &rc);
const HDC hScreenDC = GetDC(nullptr);
const HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
const int width = GetDeviceCaps(hScreenDC, HORZRES);
const int height = GetDeviceCaps(hScreenDC, VERTRES);
hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
HBITMAP(SelectObject(hMemoryDC, hBitmap));
BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
PrintWindow(hWnd, hMemoryDC, PW_CLIENTONLY);
OpenClipboard(nullptr);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
}
Это функция преобразования HBITMAP
в Byte
, которую я пробовал, которая возвращает байт emtpy:
static byte BitmapToByte(HBITMAP bit)
{
BITMAP bitmap;
GetObject(bit, sizeof(BITMAP), &bitmap);
const int size = bitmap.bmHeight*bitmap.bmWidth*bitmap.bmBitsPixel / 8;
byte lp_bits;
GetBitmapBits(HBITMAP(bit), size, &lp_bits);
return lp_bits;
}
Также я прочитал некоторые приложения с открытым исходным кодом, и они используют этот метод, но конвертирующая часть слишком сложная.
UPDATE:
Итак, я нашел это: c ++, как отправить Hbitmap через сокет , и он близок к тому, что я хочу сделать, но решение не завершено. Однако у меня возникла идея: просто получите пиксели из растрового изображения, а затем отправьте те пикселей или сохраняя эти данные в массив байтов, а затем отправьте данные.