首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编写一个转储屏幕像素的RDP客户端

编写一个转储屏幕像素的RDP客户端
EN

Stack Overflow用户
提问于 2014-01-03 22:17:50
回答 4查看 1.5K关注 0票数 6

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

到目前为止,我最好的尝试是使用函数gdi_GetPixel_32bpp,但当然,依次为每个像素调用此函数的效率很低。

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

EN

回答 4

Stack Overflow用户

发布于 2014-03-26 03:05:41

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

票数 2
EN

Stack Overflow用户

发布于 2014-01-06 22:58:03

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

代码语言:javascript
运行
复制
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);

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

希望这至少能对你有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-01-06 23:02:36

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

  1. RDP客户端从远程会话接收更新
  2. RDP客户端将更新转换为X11消息,很可能通过共享内存传输发送
  3. VNC服务器接收X11请求并使用它们呈现位图

因此,开销应该只是X11协议,该协议诚然很笨拙,但至少应该通过共享内存段发送。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20905662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档