获取键盘的按键(Hook)


 下面这段程序是我从网上找到的,有几处不明白的地方,请教一下

 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

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值