我要实现像 TeamViewer 这样的远程桌面服务。
我已经调查过的内容:
session 0 与 Vista 隔离
Windows 中的安全桌面。
我已经测试过的内容:
作为 Windows 服务启动的启动过程。
启动进程可以得到Winlogon.exe进程的进程Token,用复制的token调用CreateProcessAsUser创建真正的远程桌面进程。
尝试了不同的捕获方法:webRTC,它使用重复的桌面API(DXGI); D3d,它使用 GetFrontBufferData。
在截屏之前尝试切换桌面。例如,我在调用 GetFrontBufferData 之前调用了 OpenInputDesktop 和 setThreadDesktop。
我有什么问题:
相同的二进制文件和启动策略在不同的设备上得到不同的结果。在我的thinkpad(i7-10510U+UHD Graphics)和我的桌面(AMD 3600x+Nvdia 2060S)上,屏幕截图是预期的,我可以长时间获得登录屏幕和UAC屏幕(我测试了一晚上,在至少超过 7 小时)。然而,在其他设备上,结果却大不相同,其中一些设备可以捕获登录屏幕或 UAC 屏幕片刻(从 2 分钟到几个小时),但最后会出现黑屏。恢复的唯一方法是杀死屏幕捕获进程并重新启动它。
补充:我的thinkpad是Windows10专业版(19044.2728),我的桌面是Windows10家庭版(版本号丢了抱歉)。其他设备为Windows10专业版或Windows11专业版
我真的不明白是什么导致了这样的差异。硬件?还是系统版本?还是权威政策?
寻找任何可能的原因。
如果需要代码,我会粘贴它,但我的代码不是很可读:(
我已经在上面谈到了我的尝试。我期待的是屏幕捕获功能可以在每个设备上正常工作。