擷取鍵盤的按鍵(Hook)

來源:互聯網
上載者:User

 下面這段程式是我從網上找到的,有幾處不明白的地方,請教一下

 function KeyboardHookHandler(iCode : Integer;WParam : WPARAM;lParam :
LPARAM) : LRESULT ;stdcall ; export;
 const
   _KeyPressMask = $80000000 ;
   {   這裡是定義了一個常量,我看了看,主要是看最高位,進面得到鍵是按下還是
彈起 }

 begin
  Result :=0;

   if iCode <0 then
   begin
     Result :=CallNextHookEx(hNextHookProc,iCode,wParam,lParam);
     Exit;
   end;

   {  這裡是判斷是否有鍵按下  }
   if((lParam and _KeyPressMask)=0) then
   begin
    i:=getkeystate($10); //返回Shift鍵的狀態
     j:=getkeystate($14); //返回Caps Lock鍵的狀態

     { 下面這麼判斷不明白 }
     if((j and 1)=1 )then //判斷CapsLock是否按下
     begin
       //判斷Shift 是否按下

       { getKeyState 這個函數的傳回值的最高位 為 1 ,則表示按下,所以下面
這樣判斷 }
       if ((i and _KeyPressMask)=_KeyPressMask) then
       begin

       { 這裡明白 }
       if (wparam<65) then //判斷是字母鍵還是數字鍵
       begin

         {  這裡不明白為什麼要 減 16  chr 不是得到的是 ASCII 碼嗎,wparam
已經是 ASCII 碼了,為什麼還要取得ASCII 碼呢  }

       c:=chr(wparam-16);
       end else
       begin
         {  同樣,這裡為什麼要加 32 }
         c:= chr(wparam+32);
       end;
     end else
     begin
       if (wparam<65) then
       begin
         c:=chr(wparam);
       end else
       begin
         c:=chr(wparam);
       end;
     end;
   end else
   begin
     {  這裡是彈起的情況下  }
     if ((i and _KeyPressMask)=_KeyPressMask) then
     begin
       if (wparam<65) then
       begin
        c:=chr(wparam-16);
       end else
       begin
        c:= chr(wparam);
       end;
     end else
     begin
      if (wparam<65) then
       begin
         c:=chr(wparam);
       end else
       begin
         c:=chr(wparam+32);
       end;
     end;
   end;

  seek(f,FileSize(f));

  write(f,c); //將捕獲的鍵碼存入檔案

 end

 

 謝謝您了,我為要還是不明白為什麼要減 16 或 加 32 或什麼也不加不減 ,還請多
多指點

 

 

 

你好,由於wParam參數所傳遞的是虛擬索引值,所以在有CapsLock或Shift按下時需要進行
相應的轉換:
  1.虛擬索引值65~90(A~Z)之間時,需要根據CapsLock及Shift狀態確定是否轉換成小寫
a~z.(即加32).
  2.在Shift與某些鍵組合時,可能需要轉換成輔助字元,例如按下Shift及"1"健,則需轉
換成"!".
  注:你所找到的代碼並不完全正確,只有上面第一點是有規律的,第二點的轉換應該是
無規律的,你代碼中的減16演算法,應該是錯誤的. 由下面的對應關係可以看出.所以要寫
代碼進行轉換的話,只能對WParam值逐個比較,需要轉換的基本上就是下面這些了.

'1'--49--'!'--33
'2'--50--'@'--64
'3'--51--'#'--35
'4'--52--'$'--36
'5'--53--'%'--37
'6'--54--'^'--94
'7'--55--'&'--38
'8'--56--'*'--42
'9'--57--'('--40
'-'--45--'_'--95
'='--62--'+'--43
'/'--92--'|'--124
'['--91--'{'--123
']'--93--'}'--125
';'--59--':'--58
'''--39--'"'--34
','--44--'<'--60
'.'--46--''--62
'/'--47--'?'--63
'`'--96--'~'--126

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.