C#主动检测锁定键

时间:2013-07-16 17:50:30

标签: c# keyboard-events notifyicon

我有一个没有任何锁定指示器的无线键盘和鼠标,也没有捆绑任何软件提供视觉辅助,所以我自己制作。

我得到了它,如果我点击一个notifyIcon它会列出哪些锁被打开,但是我想通过在锁定之后提醒我来使它变得更聪明。

我在网上发现了一些项目,但说实话,我只想要锁定键,我不关心任何其他键盘按键。

我正在使用C#.NET 4,但如果有该版本的东西我可以使用.NET 4.5。

感谢。

4 个答案:

答案 0 :(得分:2)

您需要注册某种键盘挂钩以侦听按键,然后检索锁定键的状态,如下所示:
http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

除上述文章外,进行以下修改以捕获锁定键的状态:

private static IntPtr HookCallback(
    int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        Keys key = (Keys)vkCode;
        if (key == Keys.Capital)
        {
            Console.WriteLine("Caps Lock: " + !Control.IsKeyLocked(Keys.CapsLock)); 
        }
        if (key == Keys.NumLock)
        {
            Console.WriteLine("NumLock: " + !Control.IsKeyLocked(Keys.NumLock));
        }
        if (key == Keys.Scroll)
        {
            Console.WriteLine("Scroll Lock: " + !Control.IsKeyLocked(Keys.Scroll));
        }
        Console.WriteLine((Keys)vkCode);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

答案 1 :(得分:2)

以下是拦截表单上的keyup并跟踪它的示例。我更改了一个局部变量,但您可以在那时轻松触发GUI更新。

    private bool capLock;
    private bool numLock;
    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.CapsLock)
        {
            capLock = !capLock;
        }
        if (e.KeyCode == Keys.NumLock)
        {
            numLock = !numLock;
        }
    }

答案 2 :(得分:0)

请查看以下有关全局键盘事件的文章。当按下其中一个锁定键时,您可以更新UI ...

http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

答案 3 :(得分:0)

您可以使用此处所述的Control.IsKeyLocked(...)方法:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.iskeylocked%28v=vs.100%29.aspx

该方法自.NET 2.0起可用,可以像这样使用:

bool capsLock = Control.IsKeyLocked(Keys.CapsLock);
bool numLock = Control.IsKeyLocked(Keys.NumLock);
bool scrollLock = Control.IsKeyLocked(Keys.Scroll);

此解决方案不需要导入WinApi功能或手动跟踪键状态。

<强>更新

为了跟踪锁定密钥的更改,我建议您尝试以下解决方案之一:

  • 添加全局挂钩以捕获所有按键,然后检查按下的按键是否是其中一个锁定键。但是,每次按下任何键时,都会使你的钩子运行。您可以在此处找到有关键盘键全局挂钩的更多信息:http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx
  • 您还可以实现一次执行一次的计时器,检查键状态并通知用户,其中任何状态是否已更改。如果您不经常运行计时器,则不应占用太多资源。