在远程桌面上运行时替代SendKeys?

时间:2009-07-16 16:00:16

标签: remote-desktop rdp sendkeys

我有一个应用程序通过SendKeys将键击注入应用程序。

不幸的是,当我通过远程桌面运行它时,应用程序将无法运行 因为众所周知的问题是SendKeys不能与远程桌面一起使用。

之前有没有人解决过这个问题,或者对如何解决这个问题有任何好的建议?

4 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:2)

您可以通过让桌面在使用前始终登录(或配置为每次启动时自动登录@)来解决RDP问题。

即使使用自动登录,如果您需要远程桌面访问来运行自动化或管理系统等,首选方法是使用VNC进行远程访问而不是RDP。原因是VNC是跨平台的,您不会遇到此RDP问题。 VNC的工作方式类似于您实际桌面的中继(RDP控制台会话0或机器的“头部”),缺点是一次只能进行一次远程会话(或者您共享同一个桌面+键盘+鼠标)。 VNC也适用于虚拟机。使用VNC代替来自(VMWare / Hyper-V / Xen)虚拟机管理器软件的RDP或本地(RDP)访问。

唯一需要注意的是VNC仍然是桌面没有配置为在空闲或屏幕保护程序上自动锁定,这也可能会阻止发送密钥和GUI自动化,因此请务必禁用它。屏幕保护程序&显示器省电是好的,没有自动锁定&密码保护。

注意:我不确定,但是相信自从VNC以“原样”方式中继桌面时,它与从应用程序/系统的角度执行本地操作相同,所以它理论上也应该能够欺骗系统/应用程序,不允许通过RDP SendKeys。我对AutoIt + SendKeys使用这种VNC方法没有任何问题,无论我是通过VNC主动连接还是断开连接(sendkeys /自动化在断开连接后仍然继续工作,因为在实际桌面上,它仍然登录,只是VNC没有活性)。

答案 2 :(得分:2)

在我的情况下,我成功地使用WinAPI的SendInput和硬件扫描代码。似乎SendKeys将字符映射到扫描代码不正确。

答案 3 :(得分:1)

在我的情况下,我使用sendkeys作为测试自动化的一部分。它不适用于我的构建机器,构建代理程序通过远程桌面协议运行。我对此并不满意,但我能够跳过该测试作为自动构建的一部分。

使用Win32调用发送窗口消息可能有效,如果我有时间,我可能会在某一天尝试。

无论如何,这里是检查当前代码是否在远程桌面会话中运行:

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")