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