Преобразование растрового изображения скриншота в байт для vncviewer возвращает пустое значение - PullRequest
1 голос
/ 10 марта 2019

Я использую эту функцию, чтобы сделать скриншот из определенного окна или целого рабочего стола, и она работает, потому что я вижу результат со вставкой в ​​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 через сокет , и он близок к тому, что я хочу сделать, но решение не завершено. Однако у меня возникла идея: просто получите пиксели из растрового изображения, а затем отправьте те пикселей или сохраняя эти данные в массив байтов, а затем отправьте данные.

...