C#用键盘挂钩关闭盖

C#用键盘挂钩关闭盖,c#,winapi,keyboard-hook,C#,Winapi,Keyboard Hook,我得到了一个低级键盘挂钩,并试图在按下后关闭capslock。我尝试使用keybd_事件和SendInput,这两种方法都会在控制台中向我发送一个“大写字母”,但并没有关闭它 按下Capslock后,关闭Capslock的最佳方法是什么?您可以检查是否正确使用keybd\u事件关闭caps lock。但是,在您的情况下,您需要注意以下几点。如果您在WM_键控中尝试此操作,您将干扰当前的键控处理,这可能会导致您遇到的问题。您应该异步发送这些密钥。更好的方法是阻止最初的caps lock keyup

我得到了一个低级键盘挂钩,并试图在按下后关闭capslock。我尝试使用keybd_事件和SendInput,这两种方法都会在控制台中向我发送一个“大写字母”,但并没有关闭它

按下Capslock后,关闭Capslock的最佳方法是什么?

您可以检查是否正确使用keybd\u事件关闭caps lock。但是,在您的情况下,您需要注意以下几点。如果您在WM_键控中尝试此操作,您将干扰当前的键控处理,这可能会导致您遇到的问题。您应该异步发送这些密钥。更好的方法是阻止最初的caps lock keyup/keydown消息,这样caps lock就不会首先打开。从以下文件:

如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程


用全局钩子做这件事是愚蠢的。如果要在系统范围内禁用caps lock,请编辑注册表。这相当于更改
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard布局中的“扫描代码映射”。您可以完全禁用caps lock键,甚至可以将其更改为有用的内容,如Ctrl。示例。@CodyGray但这并不是我想做的全部,我也不想在每次更改后重新启动。键盘挂钩不是“将Capslock变成shift、ctrl等“修改器”的有效方法。它不会按您希望的方式工作。我已经给了你一个解决办法。撬开键盘上的键帽是另一种选择,甚至不需要重新启动。@CodyGray我仍然不想按下键,也不想再按一次shift键或ctrl键或完全禁用它。我的目标是能够按Capslock&Q(或W,E…)执行宏或单个击键之类的操作。我将尝试一下。我不想把Capslock变成像shift、ctrl这样的“修饰符”。当我屏蔽capslock的按键信息时,我是否仍然能够得到类似“capslock&Q”的东西,在屏幕上返回“A”?
    private static IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        if (nCode >= 0 && wParam == (IntPtr)KeyboardMessages.WM_KEYDOWN)
        {
            Console.WriteLine((Keys)vkCode);
        }
        if (nCode >= 0 && wParam == (IntPtr)KeyboardMessages.WM_KEYUP && vkCode == (int)myKey.CapsLock)
        {
            // Turn CapsLock off
        }
        return CallNextHookEx(_hookIDKeyboard, nCode, wParam, lParam);