【原创】小键盘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:我非常小众软件那个网站,尤其是他们“简洁、实用、干净”的主张我非常欣赏,包括他们友情链接的网站(也是非常精致实用的风格)……

posted @ 2013-10-18 10:39  钻葛格  阅读(11008)  评论(2编辑  收藏  举报