我问这个问题是因为我可能可以在几周内研究它,但是我希望这里的某些人知识渊博并能给我指路。
我的问题源于试图制作remoting desktop software(仅仅是为了好玩)的几年挑战。起初我发送了整个桌面的简单PNG。然后我终于进入镜像驱动程序捕获(DemoForge的DFMirage镜像驱动程序),这是超级快速的。但它绝对不够快。我试图通过将图像分成16个16个图块来实现缓存,这将是很多重复,我只需要发送哈希,但它通常只是一种迟滞和消失。
我还有另一个涉及API挂钩的项目。我正在这个其他项目中挂钩Direct3D。从C#开始,这意味着使用像EasyHook这样的挂钩库,因为C#是一种托管语言。我想知道是否可以将其应用于我的远程桌面项目。
问题:是否有可能,如果可能,我可以将gdi32.dll挂钩以将所有桌面绘图重定向到我的应用程序?
但是等等,不要跳到回答,因为我的问题本身可能不正确。
我的最终目标当然是将屏幕从一台计算机有效地转移到另一台计算机。现在,VNC和大多数远程桌面产品通过将屏幕转换为图像来工作。作为像素数据。虽然这非常灵活,但它肯定会尽可能慢。
所以我的猜测是gdi32.dll会绘制您在桌面上看到的所有内容。它是否正确?我认为我错了,因为DWM aero似乎使用更先进的东西。那么在桌面上绘制所有东西是什么呢?如何绘制窗户?
我的想法是,如果我可以拦截所有绘图功能,那么我可以超越像素级别并变得像Windows远程桌面,我在那里发送绘图命令而不是实际像素。
如果我完全不对劲,那么远程桌面如何“知道”如何发送这些原始绘图命令?文档说远程桌面有一个“底层渲染引擎”,可以“理解”屏幕上的内容作为这些原始绘图命令,但我怎么能得到?
我正在寻找一个答案,可以在这个图形级别上给我一个更大的Windows内部视角,以及如何实现我的目标的方向(如果它甚至是现实的)。