急!!!屏蔽ctrl+alt+del还有问题请教各位高手!(nt下)
我要在nt 下屏蔽ctrl+alt+del
我搜索了以前的帖子,找到了以下程序!但其中还有几个问题要请教各位:
1.编译是提示:找不到variants.dcu文件,何故?是不是还要有一个varants单元?
2.其中的hook单元没有提供,有没有必要加上,那位高手能给我提供?
谢谢!!!
但我把引用hook单元的语句和variants删除掉,程序运行后不起作用,即 ctrl+alt+del还是可以用
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,extctrls, variants,
StdCtrls;
type
TForm1 = class(TForm)
about: TButton;
enable: TButton;
disable: TButton;
exit: TButton;
procedure aboutClick(Sender: TObject);
procedure enableClick(Sender: TObject);
procedure disableClick(Sender: TObject);
procedure exitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses hook;
{$R *.DFM}
type
//Declaration from VC++ WINUSER.H
//
PKBDLLHOOKSTRUCT=^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT=record
vkCode:DWORD;
scanCode:DWOrD;
flags:DWORD;
dwExtraInfo:DWORD;
end;
const
LLKHF_ALTDOWN=KF_ALTDOWN shr 8;
WH_KEYBOARD_LL=13;
var
hhkNTKeyboard:HHOOK; //钩子句柄
//低级键盘钩子回掉函数
//
function lowlevelkeyboardfunc(ncode:integer;w_param:wparam;l_param:lparam):lresult;stdcall;
var
bleatkeystroke:boolean;
p:pkbdllhookstruct;
begin
bleatkeystroke:=false;
if ncode=hc_action then
begin
case w_param of
wm_keydown,wm_syskeydown,wm_keyup,wm_syskeyup:
begin
p:=pkbdllhookstruct(l_param);
//进行按键过滤
bleatkeystroke:=(((p^.vkcode=vk_tab) and
((p^.flags and llkhf_altdown)<>0)) or
((p^.vkcode=vk_escape) and
((p^.flags and llkhf_altdown)<>0)) or
((p^.vkCode=vk_escape) and
((getkeystate(vk_control) and $8000)<>0)) or
((p^.vkcode=vk_delete) and
((p^.flags and llkhf_altdown)<>0 ) and
((getkeystate(vk_control) and $8000) <> 0)));
end;
end; //end of case
end;
if bleatkeystroke then
begin
result:=1; //捕获这些组合键,按键消息由自己处理,必须返回1
hook.showhookinfo; //显示一个窗口,你可以改为自己的处理代码
end
else
///其他的按键,交由别的线程处理(过滤)
result:=callnexthookex(0,ncode,w_param,l_param);
end;
procedure TForm1.aboutClick(Sender: TObject);
begin
//Application.MessageBox(PChar('Windows NT 键盘钩子演示程序'#13#10#13#10'作者:Phoenix2000,2001年7月。'),'关于本程序',0);
end;
procedure TForm1.enableClick(Sender: TObject);
begin
//挂上键盘钩子
//
hhkNTKeyboard:=SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardFunc,
HInstance,0);
if hhkNTKeyboard<>0 then
Application.MessageBox('系统键盘钩子已经启动了!','信息',64)
else
Application.MessageBox('无法启动系统键盘钩子!','错误',16);
end;
procedure TForm1.disableClick(Sender: TObject);
begin
//解除键盘钩子
//
if hhkNTKeyboard=0 then
Application.MessageBox('系统键盘钩子已经被禁止了!','警告',48)
else
begin
UnhookWindowsHookEx(hhkNTKeyboard); //卸载钩子
hhkNTKeyboard:=0;
Hook.ClearHookForm; //此行代码与钩子无关,不要误解,是我自己的窗体清除
Application.MessageBox('成功卸载系统键盘钩子!','信息',64)
end
end;
procedure TForm1.exitClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
hhkntkeyboard:=0; //钩子句炳初值
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
canclose:=(hhkntkeyboard=0);
if not canclose then
application.MessageBox('请先卸载系统键盘钩子,然后再退出本程序!','警告',48);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if hhkntkeyboard<>0 then
begin
unhookwindowshookex(hhkntkeyboard);
hhkntkeyboard:=0;
end;
hook.cleanhookform;
end;
end.