2010-06-30 70 views
3

我有一个值的字符串,我想模拟每个字符的窗口中的按键事件。将字符转换为虚拟键码

我打算发送WM_KEYDOWN,WM_CHARWM_KEYUP事件到窗口(因为这是什么似乎发生的关键是手动按下)。

这些消息需要基于对virtual key codes的表中的wParam一个int发送。我可以遍历字符串并获取每个字符,但是如何获取该字符并将其转换为与虚拟键码相对应的值? Convert.ToInt32()不起作用。

回答

3

发送WM_KEYDOWN/UP很麻烦。应用程序本身已经使用修饰键(Shift,Alt,Ctrl)的状态和键盘布局将WM_KEYDOWN消息转换为WM_CHAR。你无法控制这两者,你会随机地得到错误的人物。

只需发送WM_CHAR消息,设置WPARAM字符码。没有必要担心lparam,很少有应用程序曾经使用它。

+0

它似乎工作,至少在这个应用程序。谢谢。 – Jeremy 2010-06-30 19:22:58

+2

没错,这个答案可能是最好的方法,除非你正在试图为每个keydown/keyup __做别的事情,不需要发送'WM_KEYDOWN'或'WM_KEYUP'消息 - 没有什么不可思议的事情发生。 – bobobobo 2010-06-30 19:29:02

0

它看起来像需要ASCII字符并将其转换为十六进制。例如,十六进制中的'A'是41.根据你的图表,A是0x41,这是正确的(0x引爆十六进制)。

+0

KABOOM!爱它。 – 2010-06-30 18:48:02

+0

*'0x引爆十六进制* *啊,低级代码的危险。这禅宗珍闻确实解释了很多。 – 2010-07-01 14:17:59

0

一般而言,而不是直接发送WM_KEYDOWNWM_CHARWM_KEYUP消息,则应该使用SendInput(优选的)或可能keybd_event(建议使用)。

+0

无法使用SendInput或keybd_event,因为它没有出现我可以指定一个窗口句柄。即使窗口没有焦点,我也需要发送消息 – Jeremy 2010-06-30 19:18:47

0

您可以使用Input Simulator库,它提供了一个高层次的API来模拟按键和处理所有低层次的东西。

+0

我不相信你可以用输入模拟器指定一个窗口句柄。即使窗口没有焦点,我也想发送消息。 – Jeremy 2010-06-30 19:19:54

0

System.Windows.Forms.SendKeys是一个WinForms类与活动窗口上模拟键盘输入的静态方法。

美中不足的是,.NET没有聚焦在另一个应用程序窗口(在SendKeys docs谈如何让周围)的方式。

+0

这不是我的首选方法,因为它要求目标应用程序处于最佳状态。用消息发送字符不需要目标在顶部可见。 – 2015-12-23 03:56:56

0

一般的解决方法是使用SendMessage WinAPI的功能。 This link描述SendMessage的签名并提供样本导入。

哦,并且为了映射VK代码,您应该使用MapVirtualKey - 最好假定映射是任意的而不是逻辑的。

9

VkKeyScanEx有人吗?根据MSDN:

“将字符翻译为相应的虚拟键码和移位状态。”

(你可能也使用VkKeyScan但要注意,它已被VkKeyScanEx取代。)

+0

也适用于C++! VkKeyScanEx接受字符和键盘布局::英文版的示例'HKL myKL = LoadKeyboardLayout(“00000409”,0x00000001);'然后只是'VkKeyScanEx(yourChar,myKL);' – 2014-11-20 17:22:37