【发布时间】:2010-06-30 18:35:45
【问题描述】:
我有一串值,我想在一个窗口中为每个字符模拟按键事件。
我计划将WM_KEYDOWN、WM_CHAR 和WM_KEYUP 事件发送到窗口(因为这似乎是手动按下键时发生的情况)。
这些消息需要根据virtual key codes 的表在 wParam 中发送一个 int。我可以遍历字符串并获取每个字符,但是如何获取该字符并将其转换为与虚拟键码对应的值? Convert.ToInt32() 不起作用。
【问题讨论】:
我有一串值,我想在一个窗口中为每个字符模拟按键事件。
我计划将WM_KEYDOWN、WM_CHAR 和WM_KEYUP 事件发送到窗口(因为这似乎是手动按下键时发生的情况)。
这些消息需要根据virtual key codes 的表在 wParam 中发送一个 int。我可以遍历字符串并获取每个字符,但是如何获取该字符并将其转换为与虚拟键码对应的值? Convert.ToInt32() 不起作用。
【问题讨论】:
【讨论】:
HKL myKL = LoadKeyboardLayout( "00000409", 0x00000001 ); 然后只是 VkKeyScanEx( yourChar, myKL );
发送 WM_KEYDOWN/UP 很麻烦。应用程序本身已经使用修饰键(Shift、Alt、Ctrl)的状态和键盘布局将 WM_KEYDOWN 消息转换为 WM_CHAR。这两者都不是你能控制的,你会随机得到错误的字符。
只需发送 WM_CHAR 消息,将 wparam 设置为字符代码。无需担心 lparam,很少有应用会使用它。
【讨论】:
WM_KEYUP 消息——没有什么神奇的事情发生。
看起来它需要 ASCII 字符并将其转换为十六进制。例如,十六进制的'A'是41。根据你的图表,A是0x41,这是正确的(0x引爆十六进制)。
【讨论】:
一般来说,您应该使用SendInput(首选)或keybd_event(不推荐),而不是直接发送WM_KEYDOWN、WM_CHAR和WM_KEYUP消息。
【讨论】:
您可以使用 Input Simulator 库,它提供了一个高级 API 来模拟按键并处理所有低级的东西。
【讨论】:
System.Windows.Forms.SendKeys 是一个 WinForms 类,具有用于在活动窗口上模拟键盘输入的静态方法。
问题是 .NET 无法将窗口集中在另一个应用程序中(SendKeys docs 讨论了如何解决这个问题)。
【讨论】:
一般的解决方案是使用SendMessage WinAPI 函数。 This link 描述了SendMessage 的签名并提供了一个示例导入。
哦,要映射 VK 代码,您应该使用 MapVirtualKey - 最好假设映射是任意的而不是逻辑的。
【讨论】: