1. 程式人生 > >簡易的識別大小寫的鍵盤鉤子

簡易的識別大小寫的鍵盤鉤子

初學鉤子方面的知識,回想到一些遊戲盜號的程式也是這個原理,覺得有必要好好了解一下。

程式碼段是我找了一個基本的區域性鍵盤鉤子之後修改了一下,由於我發現得到的鍵盤碼都是大寫的,那麼怎麼判斷使用者輸入的究竟是大寫還是小寫呢?

我們通過判斷shift鍵和大寫鎖定鍵這兩個鍵的狀態來確定輸入的是大寫還是小寫,用到的函式是GetKeyState和GetAsyncKeyState,判斷CapsLock只能用前者,判斷Shift只能用後者,GetAsyncKeyState在按下某鍵的同時呼叫,判斷正在按下某鍵。GetKeyState則在按過某鍵之後再呼叫,它返回最近的鍵盤訊息從執行緒的佇列中移出時的鍵盤狀態,判斷剛按過了某鍵(請自行思考脈衝訊號)。這兩個鍵對應的虛擬鍵值是VK_SHIFT和VK_CAPITAL

使用GetKeyState獲得返回值後,我們發現,當capslock按下時,返回-127,對應二進位制是1111111100000001,沒按下時返回0

shift鍵則是按下時為1,對應二進位制 1000 0000 0000 0001,沒按下時返回0

按照MSDN上面的說明

  • If the high-order bit is 1, the key is down; otherwise, it is up.
  • If the low-order bit is 1, the key is toggled. A key, such as the caps lock key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.

高位為1時為按下狀態,地位為1時為觸發狀態(典型例子就是capslock鍵),至於二進位制為什麼表示成那樣我想應該是經過了補碼的轉換,總的來說是這樣:

capslock未按,shift未按--->小寫

capslock未按,shift按下--->大寫

capslock按下,shift未按--->大寫

capslock按下,shift按下--->小寫

我們可以用兩個BOOL型別的變數來儲存他們是否按下,然後將這兩個變數進行異或操作,便可以知道現在是應該捕獲大寫還是小寫了。

程式碼如下:

 

接下來在你的主函式裡呼叫g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());

注:邏輯有些混亂,bug是難免滴,我真是不求甚解,鄙視自己一個

但是好歹功能還是沒有錯誤的。。。

提出兩個問題:

1、if(lParam   &   0x80000000)為什麼這一行程式碼不註釋起來讀取到的全域性變數總是0?

2、vc中怎樣實現傳送郵件呢?之前我寫了一個java的傳送郵件的程式,不知道用C++怎麼實現(socket通訊才是王道哇咔咔)