2

识别击键是否是可打印字符(应该出现在文本框中)的最简单方法是什么?我想将 F1、Home 等键与实际出现在文本框中的键分开。我试图通过自己识别所有不可打印的字符来避免大量的 IF 语句。

由于控件的设计,不能使用 KeyUp、KeyPress 等事件。

4

1 回答 1

5

没有简单的方法。你永远不应该把自己放在这个位置。正如在 ProcessCmdKey 或 KeyDown 中所观察到的,虚拟键到 KeyPress 事件所观察到的键入键的转换非常复杂。这取决于用户选择的键盘布局。键盘布局因世界各地的机器而异。中文键盘看起来不像英文键盘,您当然可以想象这一点。此外,具有大量字符的语言,如中文和日文,使用专用程序允许用户从数万个字形中选择一个。IME(输入法编辑器)。

值得注意的问题还有“死键”,一些键盘上用于输入带有变音符号的字母的特殊键。在英语中不常见,在世界其他地方很常见。就像德语键盘上的 AltGr 键一样。这样的布局是非常有状态的,一个键会根据该状态产生不同的打字字符。换句话说,之前按下了哪些死键。此状态也是特定于进程的,不能由另一个进程检索。

我可能没有吓到你,对一个说英语的程序员来说很难做到。注意风,听起来您只想为自己的进程执行此操作,您可以调用 ToUnicodeEx() winapi 函数。它需要键盘状态,您可以通过调用 GetKeyboardState() 获得。它需要活动键盘布局,您可以从 GetKeyboardLayout() 获得。哪个需要线程 ID,您可以从 GetCurrentThreadId() 获得。返回值 1 或更大表示 KeyPress 事件可能会触发。访问 pinvoke.net 以获得正确的 pinvoke 声明。

于 2013-04-25T17:54:14.527 回答