如何模拟键盘输入到远程桌面会话?

时间:2008-12-05 21:09:24

标签: windows automation timeout remote-desktop

我正在尝试将假键盘输入发送到在远程桌面会话中运行的应用程序。我正在使用:

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

现在,此代码会将字符“a”发送到任何本地窗口,但不会发送到远程桌面窗口。

这意味着我使用远程桌面连接到服务器,然后我在该服务器上打开记事本。如果我手动按下键盘上的按键:它们出现在记事本的编辑器窗口中。但是keybd_event的假键盘输入没有导致“a”出现在记事本中。

如何从本地计算机上运行的应用程序以编程方式将假键盘输入发送到远程桌面连接内运行的应用程序?


Nitpickers Corner

在这种特殊情况下,我想这样做,因为我试图打败空闲超时。但我也可以尝试

  • 执行UI自动化测试
  • UI压力测试
  • UI故障查找测试
  • UI单元测试
  • UI数据输入测试
  • UI绘画测试
  • 或UI resiliance测试。

换句话说,我想要它的理由并不重要

注意:超时可能来自远程桌面不活动,也可能不是。我不知道,这不会影响我的问题。

4 个答案:

答案 0 :(得分:7)

答案

虽然Microsft表示您不需要and you should not发送OEM代码,但您需要发送OEM扫描代码。在此示例中,我需要发送

的OEM扫描代码
  • 键A下降
  • 键A上升

有一个picture of a chart on CodeProject列出了各种密钥的make和break扫描代码:

alt text

在我的情况下,对keybd_event的原始调用需要更改为:

Byte key = Ord("A");

keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up

我对此进行了测试,但它确实有效。一切都很好。

答案 1 :(得分:2)

可能您可以使用 autoit 执行PsExec脚本,这是一个轻量级的telnet替换,可让您在其他系统上执行进程,并具有完整的交互性控制台应用程序,无需手动安装客户端软件。

(AutoIt能够向任何窗口应用程序发送任何信号(密钥或其他信号),并且可以通过远程桌面上的PsExec启动)

例如,像KillSaver这样的AutoIt脚本旨在移动鼠标以避免计算机上任何延长的空闲时间!

答案 2 :(得分:2)

这非常有效,谢谢。为了获得键盘扫描码,可以使用:

int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up

答案 3 :(得分:0)

你可以使用SendMessage(); 它真的是一个更好的键模拟器。 好吧,祝你好运!