【问题标题】:Apply modifier keys to characters将修饰键应用于字符
【发布时间】:2012-06-05 06:46:23
【问题描述】:

将键盘的修饰键应用于字符以获取其修改值(对于当前文化)的最佳方法是什么?

例如,按下 shift 键(对于英国键盘):

Assert.AreEqual('!', Modify('1'));
Assert.AreEqual('"', Modify('2'));
Assert.AreEqual('A', Modify('a'));
Assert.AreEqual('B', Modify('b'));
Assert.AreEqual(':', Modify(';'));
Assert.AreEqual('?', Modify('/'));

我有办法判断是否按下了修饰键,但我没有办法在给定这组修饰键的情况下映射到正确的字符。

【问题讨论】:

  • 我会说是一本字典,但它的可扩展性不是很好,尤其是当您必须支持多种键盘布局时。
  • @JeffMercado 如果用户使用修改后的自定义键盘布局,情况会更糟!
  • @JeffMercado 我考虑过,但这是针对可能在许多地区使用的应用程序,因此我自己解决问题是不可行的。
  • 这不是你可以从编码或文化中得到的。这些关系(仅)在键盘驱动软件中定义。
  • 这根本不可能。 Modify('1') 必须并且应该返回结果列表(例如,在英文布局上它是“!”和“结束”)。并且高度依赖于键盘语言环境。

标签: c# .net-4.0


【解决方案1】:

根据您要完成的任务,可能会执行以下操作:

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern short VkKeyScan(char ch);

    [Test]
    public void Test_VkKeyScan()
    {
        Assert.AreEqual(VkKey('!'), VkKey('1'));
        Assert.AreEqual(VkKey('@'), VkKey('2'));
    }

    private short VkKey(char p)
    {
        return (short)(0xff & VkKeyScan(p));
    }

使用提供的VkKey 方法构建字典也应该不是什么大问题。

更新:正确处理多个布局需要使用 VkKeyScanEx 而不是 VkKeyScan 并明确提供当前或需要的布局作为参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2017-10-31
    • 2023-04-06
    • 1970-01-01
    • 2012-05-30
    • 2015-01-16
    • 2019-08-19
    相关资源
    最近更新 更多