VkKeyScanEx / Sendinput替代unicode?

时间:2012-01-11 15:37:42

标签: c# pinvoke sendkeys

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

除了欧元符号外,一切正常 - 没问题。当我将此字符作为参数传递给VkKeyScanExW时,它返回-1,这意味着找不到。在我的键盘上,使用Ctrl + Menu + E(德语布局)

进行定位

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

1 个答案:

答案 0 :(得分:2)

与此同时,我使用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));
}

感谢所有人的帮助。