获取 windows 中键的 'Shift' 表示

Get 'Shift' representation of a key in windows

是否有内置的方法来获得与 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 
// TimWi: https://whosebug.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
!

a
A

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

ToUnicode 处理是从 this answer from user Timwi

借用和改编的