繁体   English   中英

C# 热键字母不正确

[英]C# hotkeys incorrect letters

我使用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);
}

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

第一个问题是,当有一个完美的RegisterHotkey function 时,您正在使用键盘挂钩来获取热键。

然后就有了钥匙和字符是一回事的误解。 热键基于虚拟键,请检查Keys枚举以获取 C# 中的虚拟键值。 键和字符之间没有一对一的映射。 许多键盘布局没有[键。 例如在德语键盘上[altgr + 8

您需要从lParam指向的KBDLLHOOKSTRUCT结构中读取scanCode而不是vkCode

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM