我有一个没有任何锁定指示器的无线键盘和鼠标,也没有捆绑任何软件提供视觉辅助,所以我自己制作。
我得到了它,如果我点击一个notifyIcon它会列出哪些锁被打开,但是我想通过在锁定之后提醒我来使它变得更聪明。
我在网上发现了一些项目,但说实话,我只想要锁定键,我不关心任何其他键盘按键。
我正在使用C#.NET 4,但如果有该版本的东西我可以使用.NET 4.5。
感谢。
答案 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功能或手动跟踪键状态。
<强>更新强>
为了跟踪锁定密钥的更改,我建议您尝试以下解决方案之一: