在远程桌面上运行时,替代 SendKeys 的方法是什么?

24

我有一个应用程序,通过SendKeys向应用程序注入按键。

不幸的是,由于SendKeys无法在远程桌面中使用而导致该应用程序无法正常工作。

有人之前解决过这个问题吗?或者有什么好的建议可以解决它吗?


我已经找到了解决这个问题的方法,就是使用AutoIT脚本向RDP窗口发送按键。 - Jatin Tek
4个回答

9

SendKeys不是很适合的主要原因是:

  • 它只能发送键到活动/焦点应用程序,这从未保证可行,因为活动应用程序在实际发送键之间可能会发生变化。
  • RDP和许多其他库(例如DirectX)主要出于安全原因而阻止它们。

更好的替代方案:

使用SendMessage的示例代码:

HWND hwndNotepad = FindWindow(_T("Notepad"), NULL);
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, _T("Edit"), NULL);
SendMessage(hwndEdit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));


5

在我的情况下,我成功地使用了WinAPI的SendInput和硬件扫描码。看起来,SendKeys将字符映射到扫描码是错误的。


2
+1 如果使用增强安全性的RDP(禁用键盘等),这是最短且正确的答案。我推荐使用这个库:http://inputsimulator.codeplex.com/ 但要注意使用InputSimulator.SimulateTextEntry("text");而不是InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_B); - McK

3
您可以通过始终登录桌面(或配置为每次启动时自动登录)来解决RDP问题。即使使用了自动登录,如果您需要远程桌面访问以运行自动化或管理系统等操作,首选方法是使用VNC进行远程访问,而不是使用RDP。原因是VNC是跨平台的,您不会遇到这个RDP问题。 VNC就像您实际桌面的中继一样(RDP控制台会话0或机器的“头”),缺点是一次只能进行一个远程会话(或者您们共享相同的桌面+键盘+鼠标)。 VNC也适用于虚拟机。请使用VNC而不是从(VMWare / Hyper-V / Xen)虚拟机管理软件的本地(RDP)访问或RDP访问。

仅需注意的是,使用VNC时,要确保将桌面配置为在空闲或屏幕保护时不自动锁定,否则可能会停止发送按键和GUI自动化运行。屏幕保护和监视器节能是可以的,但不要自动锁定和密码保护。

注意:我不确定,但认为由于VNC中继的桌面“原样”,从应用程序/系统的角度来看,它与在本地执行相同,所以理论上它也能够欺骗不允许通过RDP发送按键的系统/应用程序。使用这种VNC方法进行AutoIt + SendKeys时,无论我是通过VNC实际连接还是断开连接(因为在实际桌面上,它仍然登录,只是VNC未激活),我都没有遇到问题。


有趣,感谢提供的信息。你有什么特别推荐的VNC软件吗?最好是开源的。 - Frank Schwieterman
抱歉,除了Windows之外,我没有使用过其他操作系统上的VNC服务器和客户端,因此无法提供更多建议。在Windows上,RealVNC和TightVNC表现良好,我不记得它们是否是开源软件,但它们有免费和商业版本。我只使用免费版本。免费版本唯一的限制通常是加密安全级别较低。但如果您在VPN或公司网络中工作,这通常不是太大的问题。 - David

0
在我的情况下,我正在使用sendkeys作为测试自动化的一部分。它无法从我的构建机器上工作,因为构建代理通过远程桌面协议运行。虽然我对此不太满意,但我能够在我的自动化构建中跳过该测试。
如果使用Win32调用发送窗口消息可能会起作用,如果有时间,我可能会尝试一下。
无论如何,这里是检查当前代码是否在远程桌面会话中运行的检查:
System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接