工具介紹:
我現在這個筆記本電腦沒有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:我非常小眾軟件那個網站,尤其是他們“簡潔、實用、干凈”的主張我非常欣賞,包括他們友情鏈接的網站(也是非常精致實用的風格)……
