如何通过套接字发送gdi plus数据?

How to send gdi plus data through socket?

提问人:kuybt6 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53

问:

我正在构建一个远程帮助软件,例如团队查看器,我需要在我的服务器上接收客户端的屏幕。 我用来获取丝网打印并将其保存到:gdi plusjpeg

    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {
        using namespace Gdiplus;
        UINT  num = 0;
        UINT  size = 0;
    
        ImageCodecInfo* pImageCodecInfo = NULL;
    
        GetImageEncodersSize(&num, &size);
        if(size == 0)
            return -1;
    
        pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
        if(pImageCodecInfo == NULL)
            return -1;
    
        GetImageEncoders(num, size, pImageCodecInfo);
        for(UINT j = 0; j < num; ++j)
        {
            if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
            {
                *pClsid = pImageCodecInfo[j].Clsid;
                free(pImageCodecInfo);
                return j;
            }
        }
        free(pImageCodecInfo);
        return 0;
    }
    
    class frame_catcher
    {
    public:
       int frame_catcher_func(){
    
        using namespace Gdiplus;
        IStream* istream;
        HRESULT res = CreateStreamOnHGlobal(NULL, true, &istream);
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
        {
            HDC scrdc, memdc;
            HBITMAP membit;
            scrdc = ::GetDC(0);
            int Height = GetSystemMetrics(SM_CYSCREEN);
            int Width = GetSystemMetrics(SM_CXSCREEN);
            memdc = CreateCompatibleDC(scrdc);
            membit = CreateCompatibleBitmap(scrdc, Width, Height);
            HBITMAP hOldBitmap =(HBITMAP) SelectObject(memdc, membit);
            BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
    
            Gdiplus::Bitmap bitmap(membit, NULL);
            CLSID clsid;
            GetEncoderClsid(L"image/jpeg", &clsid); 
            bitmap.Save(L"print.jpeg", &clsid, NULL); 
            bitmap.Save(istream, &clsid, NULL);
    
            delete &clsid;
            DeleteObject(memdc);
            DeleteObject(membit);
            ::ReleaseDC(0,scrdc);
        }
        GdiplusShutdown(gdiplusToken);
        istream->Release();
        return 0;
    std::cout << "Print done" << std::endl;
    }
};

我可以在代码中从哪里获得,idk,图像的“”,将其放入 a 并通过 发送? 顺便说一句,我是新手 - 对不起糟糕的编程 - 但我需要继续这样做;我正在制作我的毕业作品,无法改变它。谢谢大家。binariesstd::stringsocketc++

C++ 套接字 GDI+ 截屏视频

评论

3赞 Wyck 11/15/2023
你基本上就在那里。 然后通过套接字发送数据。稍后,如果您愿意,您需要遵循此答案LPVOID ptr = GlobalLock(res);ptrGlobalUnlock(res);
1赞 Paul Sanders 11/16/2023
为什么要使用?这并不是真正用于存储二进制数据。无论如何,他说^^^什么。std::string
0赞 Mark Ransom 11/16/2023
@PaulSanders它可能不是预期的用途,但它没有任何妨碍二进制数据的属性,这与字符数组不同。 C++程序员往往是务实的。
0赞 Paul Sanders 11/16/2023
@MarkRansom 最小惊喜原则?
0赞 Mark Ransom 11/16/2023
@PaulSanders老实说,我会选择,但我过去都用过。特别是在与知道如何使用一个而不是另一个的 API 交互时。vector<char>string

答: 暂无答案