2009-07-16 36 views
20

我有一个应用程序通过SendKeys向应用程序注入按键。在远程桌面上运行时替代SendKeys?

不幸的是,当我通过远程桌面 运行该应用程序时,该应用程序将无法工作,因为SendKeys无法与远程桌面配合使用。

有没有人解决了这个问题,或者对如何解决它的任何好的建议吗?

+0

我发现这个问题的解决方案是使用AutoIT脚本将密钥发送到RDP窗口。 – 2017-06-13 17:51:06

回答

7

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

  • 它只能发送键主动/集中申请,这是从来无法保证正常工作,因为活跃的应用程序可以在时间的键之间切换实际发送。
  • RDP和许多其他的库(例如,DirectX的)阻止它们主要是出于安全的原因。

更好的替代品:

示例代码:

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

对于具有增加的安全选项的RDP会话,模拟用户输入的唯一两种方法是编写驱动程序(https://msdn.microsoft.com/en-us/library/windows/hardware/hh439659%28v=vs.85% 29.aspx)这对C#开发人员来说是一件麻烦事,或者使用SendInput来完成工作!我建议使用库http://inputsimulator.codeplex.com/ 但请注意使用InputSimulator.SimulateTextEntry(“text”);而不是InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_B); – McK 2015-10-14 06:34:28

1

在我来说,我使用的SendKeys作为自动化测试的一部分。它不能在我的构建机器上运行,构建代理通过远程桌面协议运行。我对此并不满意,但作为自动化构建的一部分,我可以跳过该测试。

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

总之,这里是检查是否当前的代码是在远程桌面会话中运行:

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

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

甚至与自动登录,如果你需要远程桌面访问运行自动化或管理系统等,首选方法是使用VNC远程访问,而不是RDP。原因是VNC是跨平台的,你不会遇到这个RDP问题。 VNC就像你的实际桌面(RDP控制台会话0或机器的“头”)的接力,缺点在目前一个远程会话只(或大家分享相同的桌面+键盘+鼠标)。 VNC也可以用于虚拟机。(VMWare/Hyper-V/Xen)虚拟机管理器软件使用VNC代替RDP或本地(RDP)访问。

VNC唯一需要注意的是,桌面不会被配置为在闲置或屏保上自动锁定,也可能会停止发送键和GUI自动运行,因此请务必禁用该功能。屏保&显示器省电状态正常,只是没有自动锁&密码保护。

注意:我不确定,但相信自从VNC按照“按原样”转发桌面后,它与从应用程序/系统的角度在本地执行相同,因此理论上也应该可以愚弄通过RDP不允许SendKeys的系统/应用程序。对于AutoIt + SendKeys,无论是通过VNC主动连接,还是断开连接,我都没有遇到过使用此VNC方法的问题(由于在实际桌面上它仍然已登录,所以sendkeys/automation仍然在断开连接后继续工作,而VNC却没有活性)。

+0

Intersting,感谢您的信息。您有推荐的特定VNC软件吗?最好是开源的。 – 2011-09-07 17:42:39

+0

对不起,不能推荐Windows以外的地方,我只在Windows上使用VNC服务器和客户端。在Windows上,RealVNC和TightVNC很好地工作,不要回想起是否是OSS,但他们有免费和商业版本。我只使用免费。免费的唯一限制通常是关于加密安全级别。但是,如果你在VPN或公司网络中工作,这通常不是一个问题。 – David 2011-09-07 19:02:34

2

在我的情况下,我成功地使用WinAPI的SendInput和硬件扫描代码。它看起来像SendKeys映射字符不正确地扫描代码。