SendMessage - 发送区分大小写的密钥

时间:2012-11-01 17:19:32

标签: c# sendmessage

我正在尝试创建一个工作函数,使用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 {{1 }} = a]真的不会在输出上放置小写'a',而在Numpad上放置1( 0x61数字小键盘VK_NUMPAD1 0x61键),如本网站所示:

Virtual-Key Codes

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

2 个答案:

答案 0 :(得分:2)

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

所以你通过发送WM_CHAR所做的就是完成记事本本身通常所做的所有工作。哪个好,你想要发布WM_KEYDOWN消息。因为你无法预测会产生什么样的角色。您无法找到记事本的键盘状态和活动布局。

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

答案 1 :(得分:0)

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