我有一个应用程序通过SendKeys将键击注入应用程序。
不幸的是,当我通过远程桌面运行它时,应用程序将无法运行 因为众所周知的问题是SendKeys不能与远程桌面一起使用。
之前有没有人解决过这个问题,或者对如何解决这个问题有任何好的建议?
答案 0 :(得分:9)
SendKeys不太合适主要是因为:
更好的替代品:
SendMessage
或SendInput
表示简单需求使用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-")