unicode的VkKeyScanEx/Sendinput替代方案

本文关键字:方案 Sendinput VkKeyScanEx unicode | 更新日期: 2023-09-27 18:19:57

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

一切都很好-除了欧元符号。当我把这个字符作为参数传递给VkKeyScanExW时,它会返回-1,这意味着找不到。在我的键盘上,它是使用Ctrl+Menu+E(德语布局)定位的

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

unicode的VkKeyScanEx/Sendinput替代方案

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

感谢大家的帮助。