是否有内置的方法来获取与Shift键组合在一起的等效键,例如:

a + Shift-> A

1 + Shift->!

目前,我将所有键映射到字典中的方式与上面说明的大致相同。

我正在使用Windows窗体。

最佳答案

您可以通过首先调用vkKeyScan来获取所需字符的虚拟键码,从而实现所需的功能。

有了该呼叫的结果,您可以输入ToUnicode来翻译按Shift键时的字符。

上面提到的两种方法都是KeyBoard and Mouse input类别中的本地WinAPI调用。

结合以上调用并在C#中实现,您将获得以下实现(在LinqPad中测试):

void Main()
{
    GetCharWithShiftPressed('1').Dump("1");
    GetCharWithShiftPressed('a').Dump("a");
}

// Inspired on https://stackoverflow.com/a/6949520
// TimWi: https://stackoverflow.com/users/33225/timwi
public static string GetCharWithShiftPressed(char ch)
{
    // get the keyscancode
    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646329(v=vs.85).aspx
    var key = Native.VkKeyScan(ch);

    // Use toUnicode to get the actual string shift is pressed
    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646320(v=vs.85).aspx
    var buf = new StringBuilder(256);
    var keyboardState = new byte[256];
    keyboardState[(int) Keys.ShiftKey] = 0xff;
    var result = Native.ToUnicode(key, 0, keyboardState, buf, 256, 0);
    if (result == 0) return "No key";
    if (result == -1) return "Dead key";
    return buf.ToString();
}

// Define other methods and classes here
static class Native
{
    [DllImport("user32.dll")]
    public static extern uint VkKeyScan(char ch);

    [DllImport("user32.dll")]
    public static extern int ToUnicode(uint virtualKeyCode,
        uint scanCode,
        byte[] keyboardState,
        [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
        StringBuilder receivingBuffer,
        int bufferSize,
        uint flags);
}


运行以上代码,您将获得以下输出:


  1个
     !
  
  一种
     一种


此实现使用当前的活动键盘布局。如果要指定其他键盘布局,请使用将键盘布局的句柄用作其最后一个参数的ToUnicodeEx

ToUnicode处理是从用户this answerTimwi借来并改编的

关于c# - 在Windows中获取键的“Shift”表示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45017557/

10-13 07:35