从字符中获取 KeyCode?

2024-03-01

我需要能够读取字符并获取与其语言和键盘布局相关的键。

我知道如何看待文化背景和语言。 但是我怎样才能知道像英语中的“S”这样的字母并且知道它在键盘上是什么键呢? 或者对于更难的问题,我如何取出字母“ש”并知道它在键盘上的键是什么?


用一个示例程序可能比其他任何东西都更容易解释这一点:

namespace KeyFinder
{
  class Program
  {
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern short VkKeyScanEx(char ch, IntPtr dwhkl);
    [DllImport("user32.dll")]
    static extern bool UnloadKeyboardLayout(IntPtr hkl);
    [DllImport("user32.dll")]
    static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
    public class KeyboardPointer : IDisposable
    {
      private readonly IntPtr pointer;
      public KeyboardPointer(int klid)
      {
        pointer = LoadKeyboardLayout(klid.ToString("X8"), 1);
      }
      public KeyboardPointer(CultureInfo culture)
        :this(culture.KeyboardLayoutId){}
      public void Dispose()
      {
        UnloadKeyboardLayout(pointer);
        GC.SuppressFinalize(this);
      }
      ~KeyboardPointer()
      {
        UnloadKeyboardLayout(pointer);
      }
      // Converting to System.Windows.Forms.Key here, but
      // some other enumerations for similar tasks have the same
      // one-to-one mapping to the underlying Windows API values
      public bool GetKey(char character, out Keys key)
      {
        short keyNumber = VkKeyScanEx(character, pointer);
        if(keyNumber == -1)
        {
          key = System.Windows.Forms.Keys.None;
          return false;
        }
        key = (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) << 8) | (keyNumber & 0xFF));
        return true;
      }
    }
    private static string DescribeKey(Keys key)
    {
      StringBuilder desc = new StringBuilder();
      if((key & Keys.Shift) != Keys.None)
        desc.Append("Shift: ");
      if((key & Keys.Control) != Keys.None)
        desc.Append("Control: ");
      if((key & Keys.Alt) != Keys.None)
        desc.Append("Alt: ");
      return desc.Append(key & Keys.KeyCode).ToString();
    }
    public static void Main(string[] args)
    {
      string testChars = "Aéש";
      Keys key;
      foreach(var culture in (new string[]{"he-IL", "en-US", "en-IE"}).Select(code => CultureInfo.GetCultureInfo(code)))
      {
        Console.WriteLine(culture.Name);
        using(var keyboard = new KeyboardPointer(culture))
          foreach(char test in testChars)
          {
            Console.Write(test);
            Console.Write('\t');
            if(keyboard.GetKey(test, out key))
              Console.WriteLine(DescribeKey(key));
            else
              Console.WriteLine("No Key");
          }
      }
      Console.Read();//Stop window closing
    }
  }
}

Output:

he-IL
A  Shift: A
é  No Key
ש  A
en-US
A  Shift: A
é  No Key
ש  No Key
en-IE
A  Shift: A
é  Control: Alt: E
ש  No Key

(尽管您自己的控制台可能会弄乱 ש 和/或 é,具体取决于设置和字体)。

请注意,在键盘没有 AltGr 键的情况下使用 Ctrl+Alt 作为替代的 Windows 组合正是如此报告的,只是在较低级别再次将两者视为单独的,这是使 Windows 键盘不太灵活(Alt + AltGr 在 Windows 中没有意义)。

编辑:构造函数KeyboardPointer这需要一个CultureInfo具有明显的易用性,但是需要数字的键盘对于特定文化的辅助键盘很有用。例如。 en-US 最常使用 0x0149,但也存在具有不同较高单词的变体(0x00010149、0x00020149、0x00030149 等),用于 Dvorak 等变体布局,对字符的扩展支持(编写英语所需的所谓“国际美国”)诸如“naïve”、“façade”或“resume”之类的词)等等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从字符中获取 KeyCode? 的相关文章

随机推荐

  • EditText 提示文本和图标

    我正在尝试创建一个带有提示的 EditText 作为图标和文本 但是提示文本位于中心 但我希望提示文本左对齐 以便提示图标和提示文本之间应该只有制表符空格 间隙 这是我尝试过的
  • Android:弃用 startManagingCursor 的原因是什么?

    弃用 startManagingCursor 的原因是什么 我的简单应用程序有一个表视图 其中包含数据库中的数据列表 所以 我现在在 onCreate 中拥有的内容 final Cursor cursor getDataFromDB sta
  • 使用密钥来同步对代码块的访问

    通常我会锁定如下所示的关键部分 public class Cache private Object lockObject new Object public Object getFromCache String key synchroniz
  • 发布后到看到我的第一个 Android 应用程序上市需要多长时间

    我已经在市场上发布了一个应用程序 检查了设备列表 国家 地区列出了一切正常 但仍然无法通过在市场中搜索看到我的应用程序 想知道在市场上被搜索到需要时间吗 比如 3 或 7 天 小时 Thanks 这将需要几个小时 具体多长时间取决于服务器负
  • 使用 GSON 创建 JSON 字符串

    我正在上一堂像下面这样的课 public class Student public int id public String name public int age 现在我想创建新的学生 while create new student S
  • Kotlin 协程 GlobalScope.launch 与 runBlocking

    这两种方法有什么区别吗 runBlocking launch coroutineDispatcher job GlobalScope launch coroutineDispatcher job runBlocking运行新的协程并中断地阻
  • pyenv: pip: 未找到命令

    我正在尝试让 Python 2 7 在 OSX El Capitan 上与 pyenv 和 virtualenv 很好地配合 我已经安装了pyenv使用 Homebrew 然后使用 Python 2 7 11pyenv install 2
  • Textblock 中的标签自动换行不起作用

    我有一个包含相当多对象的 WPF 页面 在所有这些项目的底部 我有一个标签 需要在内容中进行文字环绕 答案很简单 通过使用 Textblock 这应该是小菜一碟 然而 即使我使用了这些项目 我仍然无法让文本换行 所以我假设其他对象中必须有其
  • 使用集合对值进行排序

    使用集合进行排序很漂亮 对我来说比使用比较器要好得多 因为我有多个相同的值 并且我希望它们不要被扔进垃圾桶 但 Collections 有它自己的问题 它似乎认为 2 组的重复数量小于其实际较小的对应部分 示例有这些键和值 katy 1 m
  • 一组图像中颜色(色调)值 (0-359) 出现次数的总和

    我有一个装满图像的文件夹 我想找到出现次数最少的色相值 为此 我为所有色调值创建一个长度为 360 的数组 获取文件夹中的所有图像 遍历它 对于每个像素 我在数组中代表色调值的索引处添加 1 例如 如果我的像素中的色调值为 0 我会在数组中
  • [Hive]查询 hive 数据库时出现“ArrayIndexOutOfBoundsException”

    当我查询配置单元基础 hive 0 11 0 和 hive 0 12 0 时 我总是得到 ArrayIndexOutOfBoundsException 但有时不会 这是错误 java lang RuntimeException Hive R
  • Python Dataframe 在微秒内重新采样

    我正在处理重新采样数据帧 它可以在几小时 几天 几分钟内工作 但重新采样的时间不会少于秒 即使时间跨度很短 程序也会挂起 那么我错过了什么吗 我尝试了 0 000001S U 等 到目前为止没有任何效果 我的时间格式 2015 08 29
  • Networkx:获取节点之间的距离

    我是使用 NetworkX 的初学者 我正在尝试找到一种方法来检测哪些节点彼此之间的距离为 x 我开始使用这个算法来获取所有对 path nx all pairs dijkstra path G 但我仍然不确定如何使用 for 循环检测节点
  • 对 (->) 作为 monad 和 functor 的实例感兴趣

    我很感兴趣 gt 当我查找有关信息时 gt 在 ghci 中 它说 data gt a b Defined in GHC Prim 到目前为止一切都很好 但是当它说时它变得非常有趣 instance Monad gt r Defined i
  • VBA - 从 Access 生成 Excel 文件(查询表)

    我有一个项目 基本上目标是使用 VBA 在 Access 中单击按钮来生成 Excel 报告 该报告的内容是 SQL Server 数据库存储过程的结果 错误行 With MeuExcel Worksheets 4 QueryTables
  • 如何从父组件修改组件的样式?

    我需要从其父组件修改 Vue 组件的一些 CSS 属性 它将覆盖组件内定义的 CSS 我首先期望对于一个组件
  • 我可以使用 Firestore 获取使用 batch().set 创建的文档的生成 ID 吗?

    有没有一种方法可以获取使用 Firestore 批量创建的文档的自动生成 ID 使用时 add 我可以轻松获得 ID db collection posts add title Hello World then function docRe
  • 部署在 Web 服务器上时 Crystal Report 图标/工具栏不起作用

    我构建了一个网页 其中包含使用 Visual Studio 2008 中包含的 Crystal 库构建的 Crystal Report It 在我的机器上工作 http jcooney net archive 2007 02 01 4299
  • JSF 读取托管 bean 中的动态输入元素

    我有一个非常复杂的 JSF 页面 我们使用带有 Facelet 的 JSF2 我必须在其中 插入 一个纯 html 表单部分 它代表稍后将创建为 Pdf 的文档的所见即所得模板 页面看起来非常简化
  • 从字符中获取 KeyCode?

    我需要能够读取字符并获取与其语言和键盘布局相关的键 我知道如何看待文化背景和语言 但是我怎样才能知道像英语中的 S 这样的字母并且知道它在键盘上是什么键呢 或者对于更难的问题 我如何取出字母 并知道它在键盘上的键是什么 用一个示例程序可能比