将字符转换为虚拟键代码

5
我有一串值,想为每个字符在窗口中模拟按键事件。 我计划向窗口发送WM_KEYDOWNWM_CHARWM_KEYUP事件(因为这是手动按键时发生的情况)。 这些消息需要在wParam中发送int,基于虚拟键代码表。 我可以循环遍历字符串并获取每个字符,但如何将该字符转换为对应于虚拟键代码的值? Convert.ToInt32()不起作用。
7个回答

12
VkKeyScanEx是什么?根据MSDN的说明,它可以将一个字符转换为相应的虚拟键代码和Shift状态。如果您使用VkKeyScan,请注意它已经被VkKeyScanEx替代。

也适用于C++!VkKeyScanEx接受char和键盘布局:英语布局示例 HKL myKL = LoadKeyboardLayout("00000409", 0x00000001); 然后只需 VkKeyScanEx(yourChar, myKL); - jave.web

5
发送WM_KEYDOWN/UP消息很麻烦。应用程序已经将WM_KEYDOWN消息转换为WM_CHAR,使用修饰键(Shift、Alt、Ctrl)和键盘布局的状态。你无法控制这些信息,有可能会随机得到错误字符。
只需发送WM_CHAR消息,将wparam设置为字符代码即可。不需要担心lparam,很少有应用程序使用它。

它似乎有效,至少对于这个应用程序来说。谢谢。 - Jeremy
2
真的,这个答案可能是最好的方法,除非你想用每个键按下/松开做其他事情,否则没有必要发送WM_KEYDOWNWM_KEYUP消息--没有什么神奇的事情会发生。 - bobobobo

0

看起来它将ASCII字符转换为十六进制。例如,'A'的十六进制是41。根据您的图表,A是0x41,这是正确的(0x表示十六进制)。


1
"0x代表十六进制"。啊,低级代码的危险啊。这句禅语确实能解释很多问题。 - Andreas Magnusson

0
通常情况下,你不应该直接发送 WM_KEYDOWNWM_CHARWM_KEYUP 消息,而是应该使用 SendInput(首选)或者可能使用 keybd_event(已弃用)。

无法使用SendInput或keybd_event,因为似乎无法指定窗口句柄。我需要能够发送消息,即使窗口没有焦点。 - Jeremy

0

您可以使用输入模拟器库,该库提供了一个高级API来模拟按键操作并处理所有低级别的细节。


我不相信你可以使用Input Simulator指定窗口句柄。我想发送消息,即使窗口没有焦点。 - Jeremy

0

System.Windows.Forms.SendKeys

是一个WinForms类,具有模拟活动窗口上的键盘输入的静态方法。
问题在于,.NET没有办法将焦点放在另一个应用程序的窗口上(SendKeys文档中讨论了如何解决这个问题)。


这不是我首选的方法,因为它需要目标应用程序在顶部。使用消息发送字符不需要目标在顶部可见。 - Hao Nguyen

0
通用解决方案是使用SendMessage WinAPI函数。 此链接描述了SendMessage的签名并提供了一个示例导入。
哦,对于映射VK代码,您应该使用MapVirtualKey - 最好假设映射是任意的而不是逻辑的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接