User32.dll ToUnicodeEx函数

时间:2017-05-29 08:59:16

标签: c# .net 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);

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

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

我使用如下方法:

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

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

enter image description here

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

enter image description here

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

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

1 个答案:

答案 0 :(得分:0)

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

LoadKeyboardLayout 的最后一个参数是 dwFlags。你给了它1,相当于KLF_ACTIVATE,或者“把这个坏小子装起来,让它成为我的键盘!”

您想用 0 调用它,它告诉它只加载布局,给它一个句柄 (IntPtr),什么都不做。

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