9

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

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”出现在记事本中。

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


吹毛求疵的角落

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

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

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

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

4

4 回答 4

7

回答

尽管 Microsft 说您不需要也不应该发送 OEM 代码,但您需要发送 OEM 扫描代码。在这个例子中,我需要发送 OEM 扫描码

  • 键 A 下降
  • A键上升

CodeProject 上有一张图表图片,其中列出了各种键的成败扫描代码:

替代文字

在我的情况下,对 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

我对此进行了测试,并且可以正常工作。所以一切都很好。

于 2008-12-05T21:54:56.493 回答
2

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

(AutoIt 非常有能力将任何信号(键或其他)发送到任何窗口应用程序,并且可以在远程桌面上使用 PsExec 启动)

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

于 2008-12-05T21:16:29.770 回答
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
于 2010-02-25T06:49:38.570 回答
0

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

于 2009-11-22T10:45:00.647 回答