rustdesk-org / RustDeskTempTopMostWindow

A temporary solution of privacy protection window on Win10. The privacy protection window is a window that covers all other windows besides taskbar and start menu.
MIT License
11 stars 35 forks source link

启用之后,rustdesk远程看不到桌面 #1

Closed iGwkang closed 1 year ago

iGwkang commented 1 year ago
  1. 运行 TestApp或者TestAppDebug
  2. 使用RustDesk连接
  3. 显示的是隐私模式图片,没有显示桌面
fufesou commented 1 year ago

不是这样用的,TestApp和TestAppDebug,只是测试用的,可以参考 README 和 代码,看看具体测试了什么。

如果peer是Windows,RustDesk连接,有个隐私模式的控制选项。 image

iGwkang commented 1 year ago

@fufesou 开启隐私模式之后,peer 端黑了一下屏然后又亮了,没有生效

fufesou commented 1 year ago

黑一下是说在 rustdesk 的界面里面吗?还是在 peer 的物理屏幕那里。

开启后的效果是这样的。物理屏幕那里应该是隐私模式的图片阻挡。

https://user-images.githubusercontent.com/13586388/205279588-7ddf5009-c04d-4149-8efe-25c1a4856799.mp4

iGwkang commented 1 year ago

物理屏幕黑了一下,然后亮了,没有显示图片,还是显示原来的桌面

fufesou commented 1 year ago

哦,那是有问题。黑屏就不对了,应该显示图片的。你的系统是 Win10 吗?你用的是 rustdesk 哪个版本呢?

iGwkang commented 1 year ago

win10,github 最新的版本 1.2.0

iGwkang commented 1 year ago

win10 22H2

fufesou commented 1 year ago

你那边运行 TestApp.exe ,是可以显示隐私模式的图片的吧? 开启隐私模式后,peer电脑有 RuntimeBroker_rustdesk.exe 进程运行吗?这个进程是注入显示图片的。

iGwkang commented 1 year ago

运行TestApp.exe能正常显示图片,但是貌似没看到RuntimeBroker_rustdesk.exe这个进程

fufesou commented 1 year ago

像是 RuntimeBroker_rustdesk.exe 文件缺失,或者运行不起来。

你的是 什么版本 ? 如果是 portal 版本,在 C:\Users\%USERNAME%\AppData\Local\rustdesk 路径下,应该有 RuntimeBroker_rustdesk.exe 如果是 安装 版本,在安装目录下,会有那个问题件。

iGwkang commented 1 year ago

谢谢,我知道原因了,peer 用的是1.1.9版本,client用的是1.2.0, 1.1.9没有隐私模式。

fufesou commented 1 year ago

哦,不谢 (^v^)

fufesou commented 1 year ago

peer 用的是1.1.9版本,client用的是1.2.0, 1.1.9没有隐私模式。

我提了新的 PR ,如果 peer 不支持隐私模式,就不会显示隐私模式的 checkbox 了 https://github.com/rustdesk/rustdesk/pull/2433

xiguaziScript commented 1 year ago

这个模式下无法覆盖鼠标吗?

fufesou commented 1 year ago

嗯,这个窗口盖不住鼠标。并且鼠标移动到任务栏的正在运行的app,预览的时候,也盖不住。

iGwkang commented 1 year ago

嗯,这个窗口盖不住鼠标。并且鼠标移动到任务栏的正在运行的app,预览的时候,也盖不住。

rustdesk用放大镜实现隐私模式,性能不太理想,帧率太低了,不知道todesk是如何实现的。

xiguaziScript commented 1 year ago

目前有没有更好的解决方案?

xiguaziScript commented 1 year ago

嗯,这个窗口盖不住鼠标。并且鼠标移动到任务栏的正在运行的app,预览的时候,也盖不住。

如果是和todesk和向日葵一样,通过驱动实现的话难度大吗?

iGwkang commented 1 year ago

嗯,这个窗口盖不住鼠标。并且鼠标移动到任务栏的正在运行的app,预览的时候,也盖不住。

如果是和todesk和向日葵一样,通过驱动实现的话难度大吗?

向日葵貌似不支持隐私模式,todesk不清楚怎么实现的,有点像放大镜的效果,但是帧率要比rustdesk要高

fufesou commented 1 year ago

ToDesk 以前是放大镜实现的,帧率是比 rustdesk 高,不清楚为啥 ToDesk 帧率明显高一些。放大镜那个抓屏是很慢。 后来他们改方案了,可能是驱动。

iGwkang commented 1 year ago

ToDesk 以前是放大镜实现的,帧率是比 rustdesk 高,不清楚为啥 ToDesk 帧率明显高一些。放大镜那个抓屏是很慢。 后来他们改方案了,可能是驱动。

我也在做一个远程桌面的产品,raylink,已经做了一段时间,之前一直在研究todesk的隐私模式怎么实现的(最终也没研究明白怎么实现的),后来测试了一下rustdesk的放大镜的方案,发现帧率太低了,然后考虑一下,放大镜的方案肯定是不能用的,目前参考了parsec的方案,使用idd创建和物理屏参数一样虚拟屏,然后把物理屏禁用来实现的隐私屏,用idd的方案的好处就是还可以创建多个虚拟屏,并且帧率可以达到很高,甚至可以达到240帧,只需要改idd驱动里面的代码就行,用idd还有一个好处就是可以给用户支持更高的分辨率,idd唯一的一个问题就是有时候会出现bug帧率上不去(锁在33帧或者67帧左右),这个应该是微软的bug,测试过todesk和parsec都会出现。

fufesou commented 1 year ago

目前 RustDesk 的隐私屏也在考虑换方案,想法和 @iGwkang 的方法一样。

xiguaziScript commented 1 year ago

目前 RustDesk 的隐私屏也在考虑换方案,想法和 @iGwkang 的方法一样。

期待大佬的完成,感谢大佬的开源

rustdesk commented 1 year ago

@iGwkang 这种体验好吗?比如我们在多个物理屏幕打开的那些应用程序窗口,又得重新排列了,用户是不会理解你们为啥要这样做的。 idd这种依然不是最优体验的方案。

iGwkang commented 1 year ago

@iGwkang 这种体验好吗?比如我们在多个物理屏幕打开的那些应用程序窗口,又得重新排列了,用户是不会理解你们为啥要这样做的。 idd这种依然不是最优体验的方案。

单屏的场景是没问题,多屏的时候有概率会出现所有窗口会跑到一个屏上(这个我尝试过解决,但是还是有点问题)。如果用户知道是通过创建一个新的显示器然后关闭物理显示器实现的隐私屏(毕竟系统屏幕设置那里能看到),用户应该能理解吧😋,相当于改了显示器设置,只是打开或关闭的时候会触发一次这个问题,用户也不会频繁的开关。当然,ToDesk那种应该才是最优解,idd这种方案只能作为备选,实在没办法了或者急着发布才采用,但我目前技术能力有限,暂时不知道ToDesk是如何实现的😢

iGwkang commented 12 months ago

@fufesou @rustdesk 对于隐私屏,在10月底的时候,我有了一些新的发现,目前已经验证完成并集成。测试的时候发现ToDesk无法覆盖屏幕键盘,这就让我不得不怀疑ToDesk是用普通置顶窗口实现的。 经过测试后,具体实现有4步:

  1. exe需要有uiaccess权限(这个可以参考https://github.com/killtimer0/uiaccess),或者通过服务进程复制current session以及token, 将token设置TokenUIAccess属性, 拉起不带uiaccess权限的exe。我是使用的后者
  2. 在第1步启动的进程中创建无边框全屏窗口,这个窗口要有TOP_MOST属性
  3. 最关键的一步:将窗口设置为不可捕获 SetWindowDisplayAffinity(hwnd, WDA_EXCLUDEFROMCAPTURE),最关键的是WDA_EXCLUDEFROMCAPTURE属性,具体说明参考: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowdisplayaffinity
  4. 通过上面三步,基本已经完成隐私屏的功能。但是会遇到另一个问题,在任务栏上,鼠标放在其他窗口预览时,隐私屏窗口没有覆盖屏幕。通过DwmSetWindowAttribute能解决,具体解决方案:https://github.com/killtimer0/uiaccess/issues/3,这里感谢一下@killtimer0

其他问题: 开启隐私屏后,再打开屏幕键盘,隐私屏依旧无法覆盖屏幕键盘,因为屏幕键盘后启动,它后设置的TOP_MOST属性,因此会覆盖在隐私屏上,解决办法是,隐私屏增加定时器,每隔500ms将隐私屏窗口再设置一次TOP_MOST属性,这样就可以覆盖屏幕键盘,并且也可以覆盖全屏游戏。 由于WDA_EXCLUDEFROMCAPTURE属性在win10 2004版本之后才支持的,因此这个方案仅适用于win10 2004,win10 2004版本的发布时间是2020 年 5 月 27 日

最近也测试了向日葵的隐私屏,向日葵的方案应该是最完美的,他能覆盖所有窗口以及鼠标(包括锁屏界面以及ctrl+alt+del的界面),通过置顶窗口是无法覆盖鼠标和这两个场景的。

fufesou commented 12 months ago

感觉分享,非常非常有帮助 😄