将字符转换为虚拟键码
我有一个值的字符串,我想模拟每个字符的窗口中的按键事件。将字符转换为虚拟键码
我打算发送WM_KEYDOWN,WM_CHAR和WM_KEYUP事件到窗口(因为这是什么似乎发生的关键是手动按下)。
这些消息需要基于对virtual key codes的表中的wParam一个int发送。我可以遍历字符串并获取每个字符,但是如何获取该字符并将其转换为与虚拟键码相对应的值? Convert.ToInt32()不起作用。
发送WM_KEYDOWN/UP很麻烦。应用程序本身已经使用修饰键(Shift,Alt,Ctrl)的状态和键盘布局将WM_KEYDOWN消息转换为WM_CHAR。你无法控制这两者,你会随机地得到错误的人物。
只需发送WM_CHAR消息,设置WPARAM字符码。没有必要担心lparam,很少有应用程序曾经使用它。
它看起来像需要ASCII字符并将其转换为十六进制。例如,十六进制中的'A'是41.根据你的图表,A是0x41,这是正确的(0x引爆十六进制)。
KABOOM!爱它。 – 2010-06-30 18:48:02
*'0x引爆十六进制* *啊,低级代码的危险。这禅宗珍闻确实解释了很多。 – 2010-07-01 14:17:59
一般而言,而不是直接发送WM_KEYDOWN
,WM_CHAR
和WM_KEYUP
消息,则应该使用SendInput
(优选的)或可能keybd_event
(建议使用)。
无法使用SendInput或keybd_event,因为它没有出现我可以指定一个窗口句柄。即使窗口没有焦点,我也需要发送消息 – Jeremy 2010-06-30 19:18:47
您可以使用Input Simulator库,它提供了一个高层次的API来模拟按键和处理所有低层次的东西。
我不相信你可以用输入模拟器指定一个窗口句柄。即使窗口没有焦点,我也想发送消息。 – Jeremy 2010-06-30 19:19:54
System.Windows.Forms.SendKeys
是一个WinForms类与活动窗口上模拟键盘输入的静态方法。
美中不足的是,.NET没有聚焦在另一个应用程序窗口(在SendKeys docs谈如何让周围)的方式。
这不是我的首选方法,因为它要求目标应用程序处于最佳状态。用消息发送字符不需要目标在顶部可见。 – 2015-12-23 03:56:56
一般的解决方法是使用SendMessage WinAPI的功能。 This link描述SendMessage
的签名并提供样本导入。
哦,并且为了映射VK代码,您应该使用MapVirtualKey - 最好假定映射是任意的而不是逻辑的。
也适用于C++! VkKeyScanEx接受字符和键盘布局::英文版的示例'HKL myKL = LoadKeyboardLayout(“00000409”,0x00000001);'然后只是'VkKeyScanEx(yourChar,myKL);' – 2014-11-20 17:22:37
它似乎工作,至少在这个应用程序。谢谢。 – Jeremy 2010-06-30 19:22:58
没错,这个答案可能是最好的方法,除非你正在试图为每个keydown/keyup __做别的事情,不需要发送'WM_KEYDOWN'或'WM_KEYUP'消息 - 没有什么不可思议的事情发生。 – bobobobo 2010-06-30 19:29:02