?? unthook.pas
字號(hào):
unit UntHook;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Dialogs, StdCtrls;
{按鍵消息的結(jié)構(gòu),Delphi中沒(méi)有。 注意:這個(gè)結(jié)構(gòu)在Windows NT 4 sp3以上系統(tǒng) 中才能使用}
type
tagKBDLLHOOKSTRUCT = packed record
vkCode: DWORD; //虛擬鍵值
scanCode: DWORD; //掃描碼值(沒(méi)有用過(guò))
{一些擴(kuò)展標(biāo)志,這個(gè)值比較麻煩,MSDN上說(shuō)得也不太明白,但是
根據(jù)這個(gè)程序,這個(gè)標(biāo)志值的第六位數(shù)(二進(jìn)制)為1時(shí)ALT鍵按下為0相反。}
flags: DWORD;
time: DWORD; //消息時(shí)間戳
dwExtraInfo: DWORD; //和消息相關(guān)的擴(kuò)展信息
end;
KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
//這個(gè)是低級(jí)鍵盤鉤子的索引值,Delphi中沒(méi)有,必須自己定義
const WH_KEYBOARD_LL = 13;
//定義一個(gè)常量好和上面哪個(gè)結(jié)構(gòu)中的flags比較而得出ALT鍵是否按下
const LLKHF_ALTDOWN = $20;
//----聲明各個(gè)函數(shù)-------------
function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
procedure hookstar; //設(shè)置鉤子
procedure hookend;
var
hhkLowLevelKybd: HHOOK;
implementation
{
功能:低級(jí)鍵盤鉤子的回調(diào)函數(shù),在里面過(guò)濾消息
參數(shù):nCode 是Hook的標(biāo)志
WParam 表示消息的類型
LParam 是一個(gè)指向我們?cè)谏厦娑x的哪個(gè)結(jié)構(gòu)KBDLLHOOKSTRUCT的指針
返回值:如果不是0的話windows就把這個(gè)消息丟掉,程序就不會(huì)再收到這個(gè)消息了。
}
function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):LRESULT; stdcall;
var
fEatKeystroke: BOOL;
p: PKBDLLHOOKSTRUCT;
begin
Result := 0;
fEatKeystroke := FALSE;
p := PKBDLLHOOKSTRUCT (lParam);
//nCode值為HC_ACTION時(shí)表示W(wǎng)Param和LParam參數(shù)包涵了按鍵消息
if (nCode = HC_ACTION) then
begin
//攔截按鍵消息并測(cè)試是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能鍵。
case wParam of
WM_KEYDOWN,
WM_SYSKEYDOWN,
WM_KEYUP,
WM_SYSKEYUP:
fEatKeystroke :=
((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or // Alt+Tab
((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0))or //
(p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin) or (p.vkCode = VK_apps) or //上面是屏蔽WIN按鍵
((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or
((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) OR
(((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete))) //AND (p.flags = true) ;
end;
end;
if fEatKeystroke = True then
Result := 1;
if nCode <> 0 then
Result := CallNextHookEx(0, nCode, wParam, lParam);
end;
procedure hookstar; //設(shè)置鉤子
begin
//設(shè)置鍵盤鉤子
if hhkLowLevelKybd = 0 then
begin
hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
if hhkLowLevelKybd <> 0 then
//MessageBox(0, '鍵盤鉤子設(shè)置成功!', '提示', MB_OK)
else
// MessageBox(0, '鍵盤鉤子設(shè)置失敗!', '提示', MB_OK);
end
else
//MessageBox(Handle, '鍵盤鉤子已設(shè)置!', '提示', MB_OK);
end;
procedure hookend;//卸載鍵盤鉤子
begin
if hhkLowLevelKybd <> 0 then
if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
begin
//MessageBox(0, '系統(tǒng)熱鍵恢復(fù)使用!', '提示', MB_OK);
hhkLowLevelKybd := 0;
end
else
//MessageBox(Handle, '鍵盤鉤子卸載失敗!', '提示', MB_OK)
else
//MessageBox(Handle, '沒(méi)有發(fā)現(xiàn)鍵盤鉤子!', '提示', MB_OK);
end;
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -