【问题标题】:Convert character to the corresponding virtual-key code将字符转换为对应的虚拟键码
【发布时间】:2011-02-25 10:44:09
【问题描述】:

目前,我使用 Win32 API 中的 VkKeyScan 方法将字符转换为其虚拟键代码。但这似乎存在的问题是,当我传递小字母时,它工作正常,而当我传递大写字母时,它不会返回适当的键码,并且类似地使用特殊字符,如“(”或“} ”。

我该怎么做?无论如何,我是否可以直接将字符串转换为其虚拟等效项,而不考虑它是否包含大写字符或特殊字符?

谢谢

【问题讨论】:

  • 不,你不能,修饰键很重要,尤其是 Shift。键盘布局“}”在德语键盘上需要一个死键(我认为)。

标签: c# virtual keycode


【解决方案1】:

您应该更清楚您的要求是什么,更具体地说是您认为合适的关键代码。 VkKeyScan 在它的documentation 中指定,在返回值的低位字节中返回虚拟键代码,在返回值的高位字节中返回移位状态。

下面的代码 sn-p 演示了这一点,它使用 '(' 字符作为 VkKeyScan 方法的输入。

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

static void Main(string[] args)
{
    var helper = new Helper { Value = VkKeyScan('(') };

    byte virtualKeyCode = helper.Low;
    byte shiftState = helper.High;

    Console.WriteLine("{0}|{1}", virtualKeyCode, (Keys)virtualKeyCode);
    Console.WriteLine("SHIFT pressed: {0}", (shiftState & 1) != 0);
    Console.WriteLine("CTRL pressed: {0}", (shiftState & 2) != 0);
    Console.WriteLine("ALT pressed: {0}", (shiftState & 4) != 0);
    Console.WriteLine();

    Keys key = (Keys)virtualKeyCode;

    key |= (shiftState & 1) != 0 ? Keys.Shift : Keys.None;
    key |= (shiftState & 2) != 0 ? Keys.Control : Keys.None;
    key |= (shiftState & 4) != 0 ? Keys.Alt : Keys.None;

    Console.WriteLine(key);
    Console.WriteLine(new KeysConverter().ConvertToString(key));
}

[StructLayout(LayoutKind.Explicit)]
struct Helper
{
    [FieldOffset(0)]public short Value;
    [FieldOffset(0)]public byte Low;
    [FieldOffset(1)]public byte High;
}

运行这个 sn-p 将产生以下输出:

// 56|D8
// SHIFT pressed: True
// CTRL pressed: False
// ALT pressed: False
// 
// D8, Shift
// Shift+8

【讨论】:

  • 非常感谢!效果很好,解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多