C#热键不正确的字母

C#热键不正确的字母,c#,hotkeys,C#,Hotkeys,我使用SetWindowHook为即时全局热键设置了一个低级键盘挂钩。 但是当我尝试对诸如“;”之类的字母使用热键时[],/,它返回不正确的/高值字母。就像我按下逗号,它会给我四分之一的符号 这是回拨电话 private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { char letter; if (nCode >= 0 && wParam == (IntPtr)

我使用
SetWindowHook
为即时全局热键设置了一个低级键盘挂钩。 但是当我尝试对诸如“;”之类的字母使用热键时[],/,它返回不正确的/高值字母。就像我按下逗号,它会给我四分之一的符号

这是回拨电话

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    char letter;

    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);

        letter = (char)vkCode;

        // converts letters to capitals
        if (char.IsLetter(letter) == true)
        {
            if ((((ushort)GetKeyState(0x14)) & 0xffff) != 0)
            {
                letter = char.ToUpper(letter);

                if (GetAsyncKeyState(((int)VirtualKeys.Shift)) != 0)
                letter = char.ToLower(letter);
            }
            else if (GetAsyncKeyState(((int)VirtualKeys.Shift)) != 0)
            {
                letter = char.ToUpper(letter);
            }
            else
            {
                letter = char.ToLower(letter);
            }
        }

        logs.Add(letter);
    }

    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

如何在不手动比较每一个错误值的情况下获取标点符号热键?

第一个问题是,当存在非常好的
注册表热键
功能时,您正在使用键盘挂钩获取热键


还有一种误解,认为一把钥匙和一个角色是同一件事。热键基于虚拟键,请检查
keys
enum以获取C#中的虚拟键值。键和字符之间没有1对1的映射。许多键盘布局没有[键。例如,在德语键盘上,
[
是altgr+8

您需要从
lParam
指向的位置读取
scanCode
,而不是
vkCode

您需要创建一个等效于
KBDLLHOOKSTRUCT
的托管
struct
,然后更改回调以获取该结构的
ref
副本