如何根据当前键盘布局将虚拟键码转换为字符?我之前已经看过几个关于这个的问题,到目前为止我找到的最好的答案是:(char)WinAPI.MapVirtualKey((uint)Keys.A,2)但是,这在两个方面都行不通方法它的作用:什么是正确的解决方案?正确的解决方案是ToUnicodeWinAPI函数:[DllImport("user32.dll")]publicstaticexternintToUnicode(uintvirtualKeyCode,uintscanCode,byte[]keyboardState,[Out,MarshalAs(UnmanagedType.LPWStr,SizeConst=64)]StringBuilderreceivingBuffer,intbufferSize,uintflags);一种将其包装成明智且方便的方法是:staticstringGetCharsFromKeys(Keyskeys,boolshift,boolaltGr){varbuf=newStringBuilder(256);varkeyboardState=newbyte[256];如果(shift)keyboardState[(int)Keys.ShiftKey]=0xff;如果(altGr){keyboardState[(int)Keys.ControlKey]=0xff;keyboardState[(int)Keys.Menu]=0xff;}WinAPI.ToUnicode((uint)keys,0,keyboardState,buf,256,0);返回buf.ToString();现在我们可以检索字符并实际获得预期结果:Console.WriteLine(GetCharsFromKeys(Keys.E,false,false));//打印eConsole.WriteLine(GetCharsFromKeys(Keys.E,true,false));//打印E//假设英式键盘布局:Console.WriteLine(GetCharsFromKeys(Keys.E,false,true));//打印Console.WriteLine(GetCharsFromKeys(Keys.E,true,true));//打印é也可以使用ToUnicodeEx检索。除了一个额外的参数,即输入语言环境ID,可以使用LoadKeyboardLayout函数检索之外,当前活动键盘布局以外的键盘布局的字符签名是相同的。[DllImport("user32.dll")]staticexternintMapVirtualKey(intuCode,uintuMapType);privatevoidtextBox1_OnKeyDown(objectsender,KeyEventArgse){charc=(char)MapVirtualKey((int)e.KeyData,(uint)2);如果(char.IsNumber(c))DoSomething();elseif(!char.IsNumber(c))DoNothing();我认为这可以使用这种方法来实现:[DllImportAttribute("User32.dll")]publicstaticexternintToAscii(intuVirtKey,intuScanCode,byte[]lpbKeyState,byte[]lpChar,intuFlags);示例用法可以在这里找到:http://www.pcreview.co.uk/forums/toascii-function-t1706394.html以上是C#学习教程:Howtoconvertvirtualkeycodesintocharactersaccordingtothecurrentkeyboardlayout?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
