2

我正在尝试使用 WinAPI 函数创建一个工作函数,以在其他应用程序(例如记事本)中逐个键写入给定的文本SendMessage。我有这样的代码:

//
SendMessage(handle, WM_CHAR, 0x41, 0);
SendMessage(handle, WM_CHAR, (int)Keys.A, 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'A', 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'a', 0); // 0x61
//

SendMessage(handle, WM_CHAR, (int)Keys.Space, 0);

//
SendMessage(handle, WM_KEYDOWN, (int)Keys.Shift, 0);

SendMessage(handle, WM_CHAR, 0x41, 0);
SendMessage(handle, WM_CHAR, (int)Keys.A, 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'A', 0); // 0x41
SendMessage(handle, WM_CHAR, (int)'a', 0); // 0x61

SendMessage(handle, WM_KEYUP, (int)Keys.Shift, 0);
//

应该写出如下输出:

aaa1 AAA1

但这段代码写道:

AAAa AAAa

为什么会这样?0x41是键的虚拟键代码A,没有Shift按下它应该创建小写字母a,并且 [char a= 0x61] 真的不会在输出上放置小写“a”,而是在数字键盘上放置 1( VK_NUMPAD1 0x61数字键盘1键),如本网站所示:

虚拟键码

SendMessage任何人都知道如何通过其他应用程序发送小写和大写字母?

4

2 回答 2

3

这不是它的工作方式。正常的方式是用户按下键盘上的 A 键。这会为记事本生成 WM_KEYDOWN 消息。记事本在调用 GetMessage() 时收到此消息。然后它调用 TranslateMessage() 并生成WM_CHAR 消息。生成的字符取决于键盘状态(如 Shift 键)和用户选择的键盘布局。键盘状态和布局都是特定于进程的。

因此,您通过发送 WM_CHAR 所做的工作就是记事本本身通常所做的所有工作。这很好,您不想发布 WM_KEYDOWN 消息。因为你无法预测会生成什么角色。您无法找出记事本的键盘状态和活动布局是什么。

如果你想要一个大写的 A,只需发送 (WPARAM)'A',如果你想要一个小写的 a,只需发送 (WPARAM)'a'。

于 2012-11-01T18:39:35.453 回答
0

部分答案是 WM_CHAR 处理文本,并不是真正设计用于处理虚拟键。它还处理您发送的任何字符。然而,WM_KEYDOWN 确实处理虚拟键

于 2012-11-01T17:54:29.607 回答