C#热键不正确的字母

时间:2011-07-10 17:59:54

标签: c# hotkeys

我使用SetWindowHook为即时全局热键设置了一个低级键盘勾。 但是,当我尝试使用热键作为';'[],/'等字母时,它会返回错误/高值字母。就像我按下逗号一样,它给了我一个1/4的标志。

这是回调

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);
}

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

2 个答案:

答案 0 :(得分:2)

第一个问题是,当有一个非常精细的RegisterHotkey函数时,你正在使用键盘钩来获取热键。

然后有一种误解,即一把钥匙和一个角色是同一回事。热键基于虚拟键,检查Keys枚举中的C#中的虚拟键值。键和字符之间没有1到1的映射。许多键盘布局没有 [键。例如,在德语键盘上[ altgr + 8

答案 1 :(得分:1)

您需要阅读scanCode而不是vkCode所指向的KBDLLHOOKSTRUCT structure中的lParam

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