const
WH_KEYBOARD_LL=13;//自定义HOOK类型
type
KbHookStru=record
vkCode:DWORD;//虚拟键码
……
2、钩子回调函数
Function KeyboardHookProc(nCode:Integer;WParam:WPARAM;LParam:LPARAM):LRESULT;stdcall;
//nCode参数是Hook的标志,一般只关心小于0时,WParam参数表示消息的类型,即消息要传递给的窗口句柄
……
if nCode=HC_ACTION then
begin
result:= 0;
//直接屏蔽F4键和ESC键
if hkStruct.vkCode=VK_F4 then result:=1;
if hkStruct.vkCode=VK_ESCAPE then result:=1;
//根据消息类型屏蔽指定键
……
3、锁定WIN等热键
Function EnableKeyboardHook:Boolean;stdcall;export;
begin
//无钩子则设置钩子
if hHk = 0 then
Begin
//第三个参数为当前实例的ID
hHk:=SetWindowsHookEx(WH_KEYBOARD_LL,@KeyboardHookProc,hInstance,0);
Result:=True;
end else
Result:=False;
end;
三、CTRL+ALT+DEL的屏幕
上面通过钩子函数实现了任意键的屏蔽,但是用上面的方法屏蔽CTRL、ALT、DEL三个键后“CTRL+ALT+DEL”组合键仍然有效,这是NT系统在安全管理中的特殊性,可以说,NT系统将“CTRL+ALT+DEL”组合键视为一个特殊键,专门用来进入“任务管理器”。NT系统在登录时,是通过WinLogon.exe程序(系统登录管理器)实现的,它用于处理系统的登录和登录过程,在用户按下“CTRL+ALT+DEL”时就能激活该程序。
要屏蔽“CTRL+ALT+DEL”组合键,必须让程序进入系统进程,这样才能实现对“CTRL+ALT+DEL”组合键的控制。本文把完成“CTRL+ALT+DEL”组合键屏蔽的钩子功能通过一个动态库实现,在程序运行阶段,把动态库临时登录到WinLogon.exe进程中,当程序运行结束时,再把登录的进程注销,从而实现消息的拦截。
1、创建动态库文件
为了让程序在运行时不会因动态库的丢失而出现错误,本文把动态库的数据通过16进制编辑软件提取出来,存放在程序的数组中,在程序运行时,临时创建动态库,并登录到系统,当程序退出时候,注销登录,并删除动态库文件。动态库的部分数据如图1,创建动态库的方法如下:首先用CreateFile函数创建DLL文件,然后用WriteFile函数将动态库的数据写入到DLL文件。
图1 部分16进制数据