在具有非美国键盘/文化的系统上,我从扫描仪接收条形码作为键盘输入。扫描仪可以设置为不同的文化。在我的情况下,它设置为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));
我对该方法的使用有效 - 解释是正确的 - 但是我的副作用是我的系统语言设置受到影响。在方法调用之前,它看起来像这样:
在方法调用之后它看起来像这样:
如何修复我的代码,以便我的系统语言不受影响?
我试图将LoadKeyboardLayout的flags参数更改为0,但ToUnicodeEx使用系统语言,而不是加载的en-US。
答案 0 :(得分:0)
我敢肯定,差不多四年后,您要么解决了这个问题,要么不再关心。不过,我会把答案放在这里,以防其他人遇到这个问题。
LoadKeyboardLayout
的最后一个参数是 dwFlags
。你给了它1
,相当于KLF_ACTIVATE
,或者“把这个坏小子装起来,让它成为我的键盘!”
您想用 0
调用它,它告诉它只加载布局,给它一个句柄 (IntPtr),什么都不做。
很抱歉,当您发布此信息时,我无法帮您回复。 :-)