【原创】小键盘NumLock状态指示工具
工具介绍:
我现在这个笔记本电脑没有NumLock指示灯,有时候用小键盘经常打不出数字来,非常苦恼。
在小众软件里也找到一些类似的工具,那些工具很不错,但是功能太多,
尤其Caps和Scroll键状态对我来说不需要,我不想为此多花费一丁点CPU资源:)
因此自己做了一个功能专一的小工具~
软件运行后就会在右下角显示一个图标,对号是开,叉号是关,没有界面,只有图标,不能多开。
NumLock状态变化时可以实时显示,鼠标点击图标就可以退出程序。
同样有此需要的同学拿走吧~ 下载
Winform做的,.net framework 版本是2.0,上面的是Release版本,内存占用大约10M,CPU占用可以忽略……
核心逻辑:
需要在NumLock键按下的时候实时捕捉到变化,因此下了全局钩子;
但是却不可以通过按键来判断状态的变化(键盘键位的按下和弹起对NumLock状态的变化影响情况比较复杂),
还是要读键盘码状态比较稳定,因此还需要有一个循环去读。
但是循环一直进行,在性能方面不是好的思路,因为很多时候大家都不会去按NumLock。
循环空转是不好的,因此我是在钩子捕捉到NumLock按下的时候马上启动一个持续4秒的循环,每秒读50次状态(绝对够精准了……)。
核心代码:
1 public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam) 2 { 3 kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct)); 4 if (kbh.vkCode == (int)Keys.NumLock) 5 { 6 if (!isRunning) 7 { 8 ThreadPool.QueueUserWorkItem(delegate { 9 isRunning = true; 10 curCount = 200; 11 while (curCount > 0) 12 { 13 SetStatus(); 14 Thread.Sleep(20); 15 curCount--; 16 } 17 isRunning = false; 18 }); 19 } 20 } 21 return 0; 22 }
1 private void SetStatus() 2 { 3 if (GetKeyState(0x90) != 0) 4 { 5 notifyIcon.Icon = Properties.Resources.Open; 6 notifyIcon.Text = "NumLock On"; 7 } 8 else 9 { 10 notifyIcon.Icon = Properties.Resources.Close; 11 notifyIcon.Text = "NumLock Off"; 12 } 13 }
PS:我非常小众软件那个网站,尤其是他们“简洁、实用、干净”的主张我非常欣赏,包括他们友情链接的网站(也是非常精致实用的风格)……