Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VkKeyScanEx/Sendinput unicode替代方案?_C#_Pinvoke_Sendkeys - Fatal编程技术网

C# VkKeyScanEx/Sendinput unicode替代方案?

C# VkKeyScanEx/Sendinput unicode替代方案?,c#,pinvoke,sendkeys,C#,Pinvoke,Sendkeys,我正在尝试发送一个字符。因此,我使用位于user32.dll中的本机方法GetKeyboardLayout和VkKeyScanExW从系统中获取当前键盘布局的虚拟键代码(以及shift和control状态)。之后,我使用user32.dll中的本机方法SendInput将此虚拟密钥代码发送到应用程序 一切正常,除了欧元区。当我将这个字符作为参数传递给VkKeyScanExW时,它返回-1,这意味着找不到。在我的键盘上,它使用Ctrl+Menu+E(德语布局)定位 现在我假设出现这种情况是因为欧元

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

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


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

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

感谢所有人的帮助。

您是否考虑过直接将
WM_CHAR
发送到目标应用程序,绕过键盘布局问题?这是发送字符的最佳解决方案,因为这样即使他们有美式英语键盘,它也能工作。但我认为你不需要GetMessageExtraInfo——我认为你误读了文档中的内容;关键是你可以把任何东西放在那里,接收过程调用GetMessageExtraInfo来读取它。