【问题标题】:VkKeyScanEx/Sendinput alternative for unicode?unicode 的 VkKeyScanEx/Sendinput 替代方案?
【发布时间】:2012-01-12 23:45:40
【问题描述】:

我目前正在尝试发送一个角色。因此,我使用位于 user32.dll 中的本机方法 GetKeyboardLayout 和 VkKeyScanExW 从系统获取当前键盘布局的虚拟键代码(以及转换和控制状态)。之后,我使用 user32.dll 中的本机方法 SendInput 将此虚拟键码发送到应用程序。

一切正常 - 除了欧元符号。当我将此字符作为参数传递给 VkKeyScanExW 时,它返回 -1,表示未找到。在我的键盘上,它位于使用 Ctrl+Menu+E(德语布局)

现在我假设发生这种情况是因为欧元符号是 unicode 符号并且未映射到 ascii 布局中。我读过 Sendinput 还允许使用硬件扫描码的 unicode 模式。所以我希望使用 SendInput 的 unicode 模式可以解决我的问题。但我想我的 virtualkey 代码不是硬件扫描代码,因为 unicode 范围更广。我在哪里可以找到如何通过 SendInput 将 unicode 字符(例如 €)发送到另一个控件/窗口的示例。 MSDN 和 pinvoke.net 没有提供有用的示例。

【问题讨论】:

  • 您是否考虑过直接向目标应用程序发送WM_CHAR,绕过键盘布局问题?

标签: c# pinvoke sendkeys


【解决方案1】:

同时我使用 SendInput 的 unicode 参数解决了这个问题。现在我不必再使用 VkKeyScan - 我可以传递字符本身。

private static void SendUnicodeChar(char input)
{
    var inputStruct = new NativeWinApi.Input();
    inputStruct.type = NativeWinApi.INPUT_KEYBOARD;
    inputStruct.ki.wVk = 0;
    inputStruct.ki.wScan = input;
    inputStruct.ki.time = 0;
    var flags = NativeWinApi.KEYEVENTF_UNICODE;
    inputStruct.ki.dwFlags = flags;
    inputStruct.ki.dwExtraInfo = NativeWinApi.GetMessageExtraInfo();

    NativeWinApi.Input[] ip = { inputStruct };
    NativeWinApi.SendInput(1, ip, Marshal.SizeOf(inputStruct));
}

感谢大家的帮助。

【讨论】:

  • 无论如何这是发送字符的最佳解决方案,从那时起,即使他们有美式英语键盘,它也可以工作。但我认为您不需要 GetMessageExtraInfo - 我认为您误读了文档的内容;关键是你可以把任何东西放在那里,接收进程调用 GetMessageExtraInfo 来读取它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多