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

你可能感兴趣的:(Lock)