Mar*_*rio 2 vb.net keyboard winforms
确定击键是否是可打印字符(应该出现在文本框中的字符)的最简单方法是什么?我想将F1,Home等键与实际出现在文本框中的键分开.我试图通过自己识别所有不可打印的字符来避免大量的IF语句.
由于控件的设计,使用像KeyUp,KeyPress等事件不是一个选项.
没有简单的方法.你永远不应该把自己放在这个位置.如KeyPress事件所观察到的,在ProcessCmdKey或KeyDown中观察到的虚拟键到键入键的转换是高度复杂的.这取决于用户选择的键盘布局.键盘布局在世界各地的机器之间变化很大.中文键盘看起来不像英文键盘,当然你可以想象这一点.此外,具有许多字符的语言(如中文和日文)使用专用程序来允许用户选择数万个字形中的一个.IME(输入法编辑器).
值得注意的还有"死键",某些键盘上的特殊键用于输入带有变音符号的字母.在英语中不常见,在世界其他地方很常见.就像德国键盘上的AltGr键一样.这样的布局是非常有状态的,一个键根据该状态产生不同的打字字符.换句话说,之前按下了什么死键.此状态也是特定于进程的,并且不能由另一个进程检索.
我可能没有吓到你,很难与一个说英语的程序员.注意风,听起来你只想为自己的过程做这个,你可以调用ToUnicodeEx()winapi函数.它需要键盘状态,你从pinvoking GetKeyboardState()得到它.它需要活动的键盘布局,你可以从GetKeyboardLayout()获得它.哪个需要线程ID,你可以从GetCurrentThreadId()获得.返回值为1或更多表示可能触发KeyPress事件.访问pinvoke.net,了解pinvoke声明是否正确.