User32.dll ToUnicodeEx 函数的用法

Mr.*_*nde 3 .net c# windows winapi

在具有非美国键盘/文化的系统上,我从扫描仪接收条形码作为键盘输入。扫描仪可以设置为不同的文化。就我而言,它设置为 en-US。在这种情况下,系统语言和条形码扫描仪语言编码是不同的。

我已经声明这个函数来解码:

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int ToUnicodeEx(uint virtualKeyCode, uint scanCode, byte[] keyboardState, [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] StringBuilder receivingBuffer, int bufferSize, uint flags, IntPtr dwhkl);
Run Code Online (Sandbox Code Playgroud)

我使用下面的方法来加载键盘布局:

[DllImport("user32.dll")]
private static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
Run Code Online (Sandbox Code Playgroud)

我使用如下方法:

// loads the interpretation of the key into buf.
ToUnicodeEx(key, scankey, keyboardState, buf, 256, 0, LoadKeyboardLayout("00000409", 1));
Run Code Online (Sandbox Code Playgroud)

我对该方法的使用有效 - 解释是正确的 - 但我有一个副作用,即我的系统语言设置受到影响。在方法调用之前,它看起来像这样:

在此输入图像描述

在方法调用之后,它看起来像这样:

在此输入图像描述

如何修复我的代码以使我的系统语言不受影响?

我尝试将 LoadKeyboardLayout 的 flags 参数更改为 0,但是 ToUnicodeEx 使用系统语言,而不是加载的 en-US。

Jam*_*mie 5

我确信,差不多四年后,您要么解决了这个问题,要么不再关心。不过,我会将答案放在这里,以防其他人遇到这个问题。

的最后一个参数LoadKeyboardLayoutdwFlags。你给了它1,这相当于KLF_ACTIVATE,或者“把这个坏男孩加载起来,让它成为我的键盘!”

您想使用 来调用它0,它告诉它只加载布局,为您提供它的句柄 (IntPtr),而不执行任何其他操作。

很抱歉,当您发布此信息时,我无法帮助您。:-)