1

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

我明白了,如果我点击一个 notifyIcon,它会列出哪些锁被打开,但我想通过在锁被使用时提醒我来让它更聪明。

我在网上找到了一些项目,但老实说,我只想要锁定键,我不在乎任何其他键盘按键。

我正在使用 C# .NET 4,但如果该版本有某些内容,我可以使用 .NET 4.5。

谢谢。

4

4 回答 4

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);
}
于 2013-07-16T18:01:58.167 回答
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;
        }
    }
于 2013-07-16T18:02:27.243 回答
0

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

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

于 2013-07-16T18:01:22.030 回答
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
  • 您还可以实现一个不时执行的计时器,检查键状态并通知用户,如果其中任何一个的状态发生了变化。如果您不经常运行计时器,它应该不会占用太多资源。
于 2013-07-16T18:02:29.137 回答