将字符转换为相应的虚拟键码

10

目前,我正在使用Win32 API中的VkKeyScan方法来将字符转换为其虚拟键代码。但是这种方法存在的问题是,当我传递小写字母时,它可以正常工作,但当我传递大写字母时,它不能返回适当的按键代码,类似地,对于特殊字符如"("或"}"也是如此。

我该怎么办呢?是否有任何方法可以直接将字符串转换为其虚拟等效物,而不考虑它是否包含大写或特殊字符?

谢谢


不,你不能这样做,修饰键很重要,特别是Shift键。而且键盘布局上,“}”在德语键盘上需要使用死键(我想)。 - Hans Passant
1个回答

10

你需要更清晰地表达你的要求,尤其是你认为什么键码是合适的。根据文档指定的VkKeyScan方法返回值的低字节是虚拟键码,高字节是变换状态。

下面的代码片段演示了如何使用'('字符作为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;
}

运行这段代码将输出以下结果:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接