【C#】UI自动化中关闭远程桌面连接,鼠标键盘失效的解决方案
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
问题原因分析:
因为通过mstsc启动远程桌面连接时,被连接的Windows会启动一个会话(Session)。此时你对远程桌面窗口里面的所有操作(鼠标,键盘)将会‘翻译’成TCP包传输过去,被连接的Windows接收到这些包之后,‘还原’命令并且在当前的活动会话上面执行。而当你断开连接时(点X关闭),会话变成断开状态,Windows会自动关闭会话(这里这样说是不准确的,事实上会话还是在的,只是状态变成断开的),也就导致了所有基于GUI的操作‘失效’了。
当最小化远程桌面时,Windows为了节约网络带宽传输,会暂时“关闭会话”,导致你的模拟操作程序失效。
最初级的两个解决方案:
1. 到远程电脑上,登录,然后关显示器,走人,记住不要远程登录它;
2. 远程连接,永远不要关,也不能最小化。
当然我也有更好的解决方案,我的解决方案可以实现远程桌面的窗口最小化或是关闭而不影响模拟键盘鼠标的脚本。
方案一:
在远程桌面(被连接到的电脑)中先执行 query session 来查看当前登录到的 session,(远程桌面的 sessionName 都以 rdp-tcp 开头):
然后用管理员用户打开命令行工具,并执行 "tscon rdp-tcp#0 /dest:console",其中 rdp-tcp#0 为该该命令会关闭远程桌面的连接,然后把连接返回给远程的那台电脑(绕开登录过程)。这里的 console 只是一个 session 的名字,而这个名字的意思并非是 C# 中 “控制台” 的意思,而是指带有输入输出设备的机器,一般直接登录电脑的会话就是 console。
假设电脑A执行 mstsc 连接到电脑B(连接成功后,电脑B黑屏),此时在电脑B上执行上述命令后(替换对应的session名字),电脑A中的远程连接窗口会被关闭,并提示远程连接会话已经终止。电脑B(假设运行在另一台物理机上)会恢复到已经登录的状态,如果需要重新让电脑B恢复锁屏状态,可以在电脑B上执行如下命令:
rundll32.exe user32.dll,LockWorkStation
方案二:
假设用于跑 UI 自动化的机器是虚拟机A,现在再使用另一台虚拟机B作为中转。本机先连接到虚拟机B,然后再从虚拟机B连接到虚拟机A,最后断开虚拟机B。
方案三(窗口最小化失效的解决方案):
修改注册表项(注:从机器A通过远程桌面连接机器B,则需要在机器A上修改注册表)
32位机器:
HKEY_CURRENT_USERSoftwareMicrosoftTerminal Server ClientRemoteDesktop_SuppressWhenMinimized
或
HKEY_LOCAL_MACHINESoftwareMicrosoftTerminal Server ClientRemoteDesktop_SuppressWhenMinimized
设置数据类型DWord,值为2
64位机器路径不同:
HKEY_CURRENT_USERSoftwareWow6432NodeMicrosoftTerminal Server ClientRemoteDesktop_SuppressWhenMinimized
或
HKEY_LOCAL_MACHINESoftwareWow6432NodeMicrosoftTerminal Server ClientRemoteDesktop_SuppressWhenMinimized
设置数据类型DWord,值为2
方案四(关机失效的解决方案):
远程桌面mstsc远程登录虚拟机时,在虚拟机中新建文本文档,写入内容:
@%windir%\System32\tscon.exe 0 /dest:console
@%windir%\System32\tscon.exe 1 /dest:console
@%windir%\System32\tscon.exe 2 /dest:console
将文本文档重新命名为‘Close_RDP’,并将后缀名改为‘.bat’,双击文件‘EnableCloseRDP.bat’关闭虚拟机,在虚拟机关闭后带有SendKey的脚本可以正常运行。打开时可能会报错,不用理会,不影响使用。
该文章在 2021/3/15 12:33:39 编辑过 |
关键字查询
相关文章
正在查询... |