我有一个没有任何锁定指示器的无线键盘和鼠标,也没有捆绑任何提供视觉辅助的软件,所以我自己做。
我明白了,如果我点击一个 notifyIcon,它会列出哪些锁被打开,但我想通过在锁被使用时提醒我来让它更聪明。
我在网上找到了一些项目,但老实说,我只想要锁定键,我不在乎任何其他键盘按键。
我正在使用 C# .NET 4,但如果该版本有某些内容,我可以使用 .NET 4.5。
谢谢。
我有一个没有任何锁定指示器的无线键盘和鼠标,也没有捆绑任何提供视觉辅助的软件,所以我自己做。
我明白了,如果我点击一个 notifyIcon,它会列出哪些锁被打开,但我想通过在锁被使用时提醒我来让它更聪明。
我在网上找到了一些项目,但老实说,我只想要锁定键,我不在乎任何其他键盘按键。
我正在使用 C# .NET 4,但如果该版本有某些内容,我可以使用 .NET 4.5。
谢谢。
您将需要注册某种键盘挂钩来监听按键,然后检索锁定键的状态,如下所示: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);
}
这是一个截取表单或其他东西上的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;
}
}
请查看以下有关全局键盘事件的文章。当按下其中一个锁键时,您可以更新您的 UI...
http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C
您可以使用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 函数或手动跟踪按键状态。
更新
为了跟踪锁定键的更改,我建议您尝试以下解决方案之一: