我有一个应用程序,它通过 SendKeys 将击键注入应用程序。
不幸的是,当我通过远程桌面运行该应用程序时,该应用程序将无法运行,因为众所周知的问题是 SendKeys 不适用于远程桌面。
以前有没有人解决过这个问题,或者对如何解决这个问题有什么好的建议?
我有一个应用程序,它通过 SendKeys 将击键注入应用程序。
不幸的是,当我通过远程桌面运行该应用程序时,该应用程序将无法运行,因为众所周知的问题是 SendKeys 不适用于远程桌面。
以前有没有人解决过这个问题,或者对如何解决这个问题有什么好的建议?
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"));
就我而言,我成功地将 WinAPI 的 SendInput 与硬件扫描代码一起使用。似乎 SendKeys 将字符映射为错误地扫描代码。
您可以通过在使用前始终登录桌面(或配置为每次启动时自动登录)来解决 RDP 问题。
即使使用自动登录,如果您需要远程桌面访问来运行自动化或管理系统等,首选方法是使用 VNC 进行远程访问而不是 RDP。原因是 VNC 是跨平台的,您不会遇到此 RDP 问题。VNC 就像您的实际桌面(RDP 控制台会话 0 或机器的“头”)的中继一样工作,缺点是一次只能进行一个远程会话(或者你们都共享同一个桌面 + 键盘 + 鼠标)。VNC 也适用于虚拟机。使用 VNC 而不是 RDP 或来自 (VMWare/Hyper-V/Xen) 虚拟机管理器软件的本地 (RDP) 访问。
使用 VNC 时唯一需要注意的是,桌面未配置为在空闲或屏幕保护程序时自动锁定,这也可能会停止发送密钥和 GUI 自动化运行,因此请务必禁用它。屏保和显示器省电还可以,只是没有自动锁定和密码保护。
注意:我不确定,但相信由于 VNC “按原样”中继桌面,从应用程序/系统的角度来看,它与本地执行相同,因此理论上它也应该能够欺骗系统/应用程序不允许通过 RDP 发送密钥。我对 AutoIt + SendKeys 使用此 VNC 方法没有任何问题,无论我是通过 VNC 主动连接还是断开连接(断开连接后 sendkeys/automation 仍然继续工作,因为在实际桌面上,它仍然处于登录状态,只是 VNC 没有积极的)。
就我而言,我使用 sendkeys 作为测试自动化的一部分。它不适用于我的构建机器,构建代理通过远程桌面协议运行。我对此并不满意,但作为我的自动化构建的一部分,我能够跳过该测试。
使用 Win32 调用发送窗口消息可能会奏效,如果我有时间我可能会在某天尝试。
无论如何,这是检查当前代码是否在远程桌面会话中运行:
System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")