【问题标题】:VB.NET: In ProcessCmdKey simplest way to determine if a key prints or not?VB.NET:在 ProcessCmdKey 中确定键是否打印的最简单方法?
【发布时间】:2013-04-19 13:17:58
【问题描述】:

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

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

【问题讨论】:

    标签: vb.net winforms keyboard


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的反馈。这是已经存在多年的生产代码。为了做正确的事,我犹豫要改变太多。
    • 感谢您提供的重要信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2021-11-11
    相关资源
    最近更新 更多