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