C++ 编写一个RDP客户端,转储屏幕像素

C++ 编写一个RDP客户端,转储屏幕像素,c++,rdp,freerdp,C++,Rdp,Freerdp,我想在C++中实现一个RDP客户端,它能够获取屏幕上所有像素的颜色值,并将它们转储到一个文件中。我知道这在概念上与RDP的工作方式不同,但我的应用程序需要它。我试图利用,但我不知道如何才能有效地编写一个简单地转储文件中所有像素的客户端 到目前为止,我最好的尝试是使用函数gdi_GetPixel_32bpp,但当然,依次为每个像素调用此函数远远不够有效 使用另一个库的解决方案也将非常受欢迎 您可以尝试这样做(免责声明未经测试的伪代码): 现在您应该在memBM->data中拥有完整的像素数据数组。

我想在
C++
中实现一个RDP客户端,它能够获取屏幕上所有像素的颜色值,并将它们转储到一个文件中。我知道这在概念上与RDP的工作方式不同,但我的应用程序需要它。我试图利用,但我不知道如何才能有效地编写一个简单地转储文件中所有像素的客户端

到目前为止,我最好的尝试是使用函数
gdi_GetPixel_32bpp
,但当然,依次为每个像素调用此函数远远不够有效


使用另一个库的解决方案也将非常受欢迎

您可以尝试这样做(免责声明未经测试的伪代码):

现在您应该在
memBM->data
中拥有完整的像素数据数组。memBM->data的大小如下:
memBM->width*memBM->height*memBM->bytesperpoixel


希望这至少对您有所帮助。

如果您运行VNC X服务器并在其中启动RDP客户端全屏(没有窗口管理器等),绘图顺序应该如下所示:

  • RDP客户端从远程会话接收更新
  • RDP客户端将更新转换为X11消息,最有可能通过共享内存传输发送
  • VNC服务器接收X11请求并使用它们渲染位图
  • 因此,开销应该是X11协议,它虽然很笨重,但至少应该通过共享内存段发送


    老实说,我会先尝试这种零编码方法,看看性能是否真的有问题。

    WebRTC可能有一些代码可以帮助您,比如or


    桌面捕获器更为复杂,因为它(1)进行扩散以捕获最小的内容,以及(2)捕获鼠标。由于桌面只是一个特殊的“窗口”,如使用
    :GetDesktopWindow()
    检索,其
    DC
    可以使用该窗口检索,或者只使用
    GetDC(NULL)
    ,因此您可以使用窗口捕获器忽略更复杂的位。有关详细信息,请查看window capturer的捕获功能,以及有关处理Aero和其他合成/屏幕外问题的一些有用提示。

    使用libfreerdp gdi以非常高效的方式,这应该相当容易做到。FreeRDP可以将所有内容渲染到软件缓冲区,然后将其转储到文件中,如果您愿意,您可以完全在内存中执行此操作,而无需使用X11环境。由于提到了Linux,一种快速入门的方法是将xfreerdp与/gdi:sw选项一起使用,以利用libfreerdp-gdi(默认情况下是使用基于X11的实现),然后在更新到来时转储像素。您可以在xf_sw_end_paint中钩住自己,这是在一系列更新的末尾调用的。您可以访问无效区域和像素缓冲区(都在rdpGdi*gdi结构下)。重要字段有gdi->primary_buffer、gdi->dstBpp、gdi->bytesperpoixel、gdi->width和gdi->height。在大多数情况下,您将得到一个XRGB32缓冲区,这很容易处理。如果有疑问,请查看gdi_init()以初始化内部缓冲区。

    您真正想做的是什么?也就是说,为什么你需要截图。可能有比实现RDP更简单的方法。@selbie我试图做的是将RDP的(至少是屏幕部分)翻译成VNC。由于VNC非常简单,我最终必须能够确定屏幕的像素值?它需要可移植吗?@它应该能够在Linux上运行,不需要跨平台。免费的RDP在Linux上运行,所以这应该不是一个大问题。好的,那么有什么原因不能只运行vnc X服务器,然后在其中全屏运行RDP客户端?这个答案缺少上下文的重要部分。什么是
    hDC
    ?这段代码应该在哪里循环?@IvayloStrandjev只是为了确定,您可以使用gdi_GetPixel_32bpp?澄清一下:如果可以的话,您实际上可以取消上面的4个调用,直接使用您正在使用的句柄上的数据。我没有意识到这个函数实际上已经在位图对象上运行了。我不确定。我没有尝试实现我提到的解决方案,因为它似乎存在严重缺陷由于memBM不是
    HGDIOBJECT类型
    我给你奖金,因为你的回答给了我一些解决问题的建议。还有一些问题我还没有弄清楚,但我现在有了一个工作原型。我将评估这个方法。你能提供更多关于最后第三步的信息吗?我不知道如何将X11消息渲染成位图。我建议VNC X服务器已经为您完成了这项工作。在我看来,这使用了自己的协议而不是RDP。我已经有了RDP流量,需要“即时”翻译它,所以我没有选择切换到其他应用程序。我不是说在chrome remote desktop上使用它,如果这是你的意思的话。我链接到的代码就是(我原以为)你想要的:将屏幕内容捕获到内存中。实际的通信格式应该是单独的。不管怎样,祝你好运把事情弄清楚!
    HGDI_DC memDC = gdi_CreateCompatibleDC ( hDC );
    HGDI_BITMAP memBM = gdi_CreateCompatibleBitmap ( hDC, screenWidth, screenHeight );
    gdi_SelectObject ( memDC, memBM );
    gdi_BitBlt(memDC, 0, 0, screenWidth, screenHeight, hDC, 0, 0, GDI_SRCCOPY);