我正在尝试创建一个工作函数,使用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
键),如本网站所示:
任何人都知道如何通过1
向其他应用程序发送大写和小写字母?
答案 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确实处理虚拟键