将屏幕快照位图转换为vncviewer的字节返回空

时间:2019-03-10 13:21:55

标签: c++ bitmap type-conversion bitmapimage vnc-viewer

我正在使用此功能从特定窗口或整个桌面获取屏幕截图,并且之所以奏效,是因为我看到粘贴到MSPaint中的结果。但是我不想将结果写入*.bmp或任何类型的文件中,我想通过将此位图数据发送到远程服务器来从头创建一个简单的vnc客户端。我可以直接通过套接字将此位图发送到服务器吗?还是我应该先将其转换为bytestring

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的函数,该函数返回空字节:

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;
}

我也已经阅读了一些开源应用程序,他们使用了这种方法,但是转换部分太编译了。

更新: 所以我发现了这一点:c++ how to send Hbitmap over socket,它接近我想要做的,但是解决方案是不完整的,但是我有了主意,只需从位图中获取像素,然后将那些像素发送或将那些像素数据保存到数组中字节然后发送数据。

0 个答案:

没有答案