C# 获取';班次';在windows中表示密钥

C# 获取';班次';在windows中表示密钥,c#,winforms,keyboard,shift,C#,Winforms,Keyboard,Shift,是否有一种内置方式可获得与换档键组合的等效键,例如: a+移位->a 1+换档-> 目前,我将所有键映射到字典中,映射方式与上面的说明基本相同 我使用的是windows窗体。您可以通过首先调用获取感兴趣的字符的虚拟密钥码来实现所需的功能 根据该调用的结果,您可以输入以翻译按下Shift键时的字符 上述两种方法都是类别中的本机WinAPI调用 结合上述调用并在C中实现,您将得到以下实现(在LinqPad中测试): 运行上述代码,您将获得以下输出: 1 ! a A 此实现使用当前活动键盘布局。如果

是否有一种内置方式可获得与换档键组合的等效键,例如:

a+移位->a

1+换档->

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


我使用的是windows窗体。

您可以通过首先调用获取感兴趣的字符的虚拟密钥码来实现所需的功能

根据该调用的结果,您可以输入以翻译按下Shift键时的字符

上述两种方法都是类别中的本机WinAPI调用

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

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

1
!

a
A

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


ToUnicode
处理是从用户那里借用和改编的,这在一定程度上取决于键盘布局。不是所有的布局都有相同的字符布局这是真的,这是一个问题,我应该如何解决这个问题,而不是@rene?我在考虑,但这取决于你想如何使用它。你能在字典中分享你打算如何使用或你目前如何使用它吗?@rene我需要包含太多的信息,我使用的解决方案实际上只是一个
字典
这将是一个只有“移位”键值的字典,这些键值的外观与问题的插图中相同,如果没有Shift-tho,这只是为了澄清。“[”例如,“将返回一个空结果,而不是一个大括号”{'@Deadzone不在我的框中…你的键盘设置是什么?它可能是一个死键吗?我的键盘布局是美国国际的。我添加了额外的错误处理,你可以尝试更改代码并让我知道结果吗?它似乎对任何控制/系统键都不起作用,它会为所有键返回0的结果。
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);
}