5

我问这个问题是因为我可能可以在几周内研究它,但我希望这里有一个知识渊博的人可以给我指导。

我的问题源于尝试制作远程桌面软件(只是为了好玩)的几年挑战。起初,我发送了整个桌面的简单 PNG。然后我终于进入了一个镜像驱动程序捕获(DemoForge 的 DFMirage 镜像驱动程序),速度非常快。但这绝对不够快。我试图通过将图像分解为 16 x 16 的图块来实现缓存,这样会重复很多次,我只需要发送散列,但它通常只是有点滞后和令人失望。

我最近还有另一个涉及 API 挂钩的项目。我目前正在这个其他项目中连接 Direct3D。在 C# 中,这意味着使用像 EasyHook 这样的挂钩库,因为 C# 是一种托管语言。我想知道是否可以将其应用于我的远程桌面项目。

问题:是否有可能,如果可能的话,我如何挂钩 gdi32.dll 以将所有桌面绘图重定向到我的应用程序?

但是等等,不要马上回答,因为我的问题本身可能不正确。

当然,我的最终目标是将屏幕有效地从一台计算机传输到另一台计算机。现在,VNC 和大多数远程桌面产品通过将屏幕作为图像传输来工作。作为像素数据。虽然这是非常灵活的,但它绝对是尽可能慢的。

所以我的猜测是 gdi32.dll 绘制了您在桌面上看到的所有内容。这个对吗?我认为我错了,因为 DWM aero 似乎使用了更“高级”的东西。那么是什么在桌面上绘制所有内容呢?窗户是怎么画的?

我的想法是,如果我可以拦截所有绘图功能,那么我就可以超越像素级别,变得像 Windows 远程桌面一样,发送绘图命令而不是实际像素。

如果我完全错了,那么远程桌面如何“知道”如何发送这些原始绘图命令?文档说远程桌面有一个“底层渲染引擎”,可以“理解”屏幕上的这些原始绘图命令,但我怎么能得到它呢

我正在寻找一个答案,它可以让我在这个图形级别上对 Windows 内部有更大的了解,以及如何实现我的目标的方向(如果它甚至是现实的)。

4

0 回答 0