24

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

不幸的是,当我通过远程桌面运行该应用程序时,该应用程序将无法运行,因为众所周知的问题是 SendKeys 不适用于远程桌面。

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

4

4 回答 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"));
于 2011-08-26T16:16:43.680 回答
4

就我而言,我成功地将 WinAPI 的 SendInput 与硬件扫描代码一起使用。似乎 SendKeys 将字符映射为错误地扫描代码。

于 2013-03-30T10:24:54.443 回答
3

您可以通过在使用前始终登录桌面(或配置为每次启动时自动登录)来解决 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 没有积极的)。

于 2011-09-07T04:59:20.173 回答
0

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

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

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

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
于 2011-08-29T16:31:36.137 回答