在XP系统下怎么屏蔽系统热键呢?比如ctrl+esc,alt_tab,ctrl+shift+del...注意是XP系统!! 在XP系统下怎么屏蔽系统热键呢?比如ctrl+esc,alt_tab,ctrl+shift+del...注意是XP系统!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转贴:SystemParametersInfo(Spi_screensaverrunning,1,@temp,0) 函数用于 Win9x/Me 中可以是系统进入屏幕保护状态,达到屏蔽 Ctrl+Alt+Del 这样的特殊系统组合键,但是在 WinNT/2000 下无效。在 NT 4.0 + SP3/Win 2000 环境下,需要用到低级键盘钩子,才能捕获到这类按键。程序中需要用到 KBDLLHOOKSTRUCT 这个结构,但在 Delphi 中没有声明,还要用到几个常量,Delphi 也没有声明,估计是被省略掉了。键盘钩子函数如果要变成全局钩子,必须存放在 DLL 中;如果仅是对于特定线程有效,可以放在 EXE 中。下面是我的代码例子,在 Delphi 6 中编译通过:unit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;type TMainForm = class(TForm) EnableBtn: TButton; DisableBtn: TButton; AboutBtn: TButton; ExitBtn: TButton; Bell1: TBevel; Image: TImage; procedure AboutBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure EnableBtnClick(Sender: TObject); procedure DisableBtnClick(Sender: TObject); procedure ExitBtnClick(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormDestroy(Sender: TObject); private { Private declarations } public { Public declarations } end;var MainForm: TMainForm;implementationuses Hook;{$R *.dfm}type // Declaration from VC++ WINUSER.H // PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; KBDLLHOOKSTRUCT = record vkCode: DWORD; scanCode: DWORD; flags: DWORD; time: 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 TMainForm.AboutBtnClick(Sender: TObject);begin Application.MessageBox( PChar('Windows NT 键盘钩子演示程序'#13#10#13#10'作者:Phoenix2000,2001年7月。'), '关于本程序', 0);end;procedure TMainForm.FormCreate(Sender: TObject);begin hhkNTKeyboard := 0; // 钩子句柄初值end;procedure TMainForm.EnableBtnClick(Sender: TObject);begin // 挂上键盘钩子 // hhkNTKeyboard := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardFunc, HInstance, 0); if hhkNTKeyboard <> 0 then Application.MessageBox('系统键盘钩子已经启动了!', '信息', 64) else Application.MessageBox('无法启动系统键盘钩子!', '错误', 16);end;procedure TMainForm.DisableBtnClick(Sender: TObject);begin // 解除键盘钩子 // if hhkNTKeyboard = 0 then Application.MessageBox('系统键盘钩子已经被禁止了!', '警告', 48) else begin UnhookWindowsHookEx(hhkNTKeyboard); // 卸载钩子 hhkNTKeyboard := 0; Hook.CleanHookForm; // 此行代码与钩子无关,不要误解,是我自己的窗体清除 Application.MessageBox('成功卸载系统键盘钩子!', '信息', 64) end;end;procedure TMainForm.ExitBtnClick(Sender: TObject);begin Close;end;procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);begin CanClose := (hhkNTKeyboard = 0); if not CanClose then Application.MessageBox('请先卸载系统键盘钩子,然后再退出本程序!', '警告', 48);end;procedure TMainForm.FormDestroy(Sender: TObject);begin if hhkNTKeyboard <> 0 then begin UnhookWindowsHookEx(hhkNTKeyboard); hhkNTKeyboard := 0; end; Hook.CleanHookForm;end;end.以上的代码在 NT 4.0 + SP3/Win 2000 下能捕获 Alt + Tab、Alt + ESC、Ctrl + ESC 这样的组合键,而 Ctrl + Alt + Del 无法捕获。有兴趣的朋友自己研究一下又没有别的办法,或是我的代码由否不妥之处。另外,NT 环境下用低级键盘钩子,只有在 NT 4.0 + SP3以上的版本才有效,在 NT 4 + SP2 都是无效的。在 Win2000 下当然有效了。 谢谢啊!只是不能捕获Ctrl + Alt + Del,继续啦! Ctrl + Alt + Del是NT系统内核控制的热键,如果被轻易截获,就谈不上什么安全性了 :-)否则有人写程序模拟锁定界面,会截获密码的。 CTRL+ALT+DEL在较高的级别被捕获,所以很难流到你的那一级. excelquerytable控件使用 怎么读取文本文件指定内容 如何转换Delphi的控件能使VB使用 怎样判断键盘输入了什么键? 想去一些公司见识见识他们的开发过程 如何遍历一幅图像,并对其像素进行比较? Delphi中有没有计算两个日期之间天数的函数??? 这个存储过程怎么写:追加text型的备注(符合一定条件的记录备注) !如何使DBGrid某列所有的内容显示为“*”,但并不真正改变字段的内容! 在郑州delphi程序员大家来这里坐坐吧!!来者有分哟! pb调用不着delphi写的dll!! 出现内存不能'read'的问题!! 菜鸟发问 控件问题
SystemParametersInfo(Spi_screensaverrunning,1,@temp,0) 函数用于 Win9x/Me 中可以
是系统进入屏幕保护状态,达到屏蔽 Ctrl+Alt+Del 这样的特殊系统组合键,但是在 WinNT
/2000 下无效。在 NT 4.0 + SP3/Win 2000 环境下,需要用到低级键盘钩子,才能捕获到
这类按键。程序中需要用到 KBDLLHOOKSTRUCT 这个结构,但在 Delphi 中没有声明,还要
用到几个常量,Delphi 也没有声明,估计是被省略掉了。键盘钩子函数如果要变成全局钩
子,必须存放在 DLL 中;如果仅是对于特定线程有效,可以放在 EXE 中。下面是我的代码
例子,在 Delphi 6 中编译通过:unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;type
TMainForm = class(TForm)
EnableBtn: TButton;
DisableBtn: TButton;
AboutBtn: TButton;
ExitBtn: TButton;
Bell1: TBevel;
Image: TImage;
procedure AboutBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EnableBtnClick(Sender: TObject);
procedure DisableBtnClick(Sender: TObject);
procedure ExitBtnClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementationuses Hook;{$R *.dfm}type
// Declaration from VC++ WINUSER.H
//
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: 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 TMainForm.AboutBtnClick(Sender: TObject);
begin
Application.MessageBox(
PChar('Windows NT 键盘钩子演示程序'#13#10#13#10'作者:Phoenix2000,2001年7月。'),
'关于本程序', 0);
end;procedure TMainForm.FormCreate(Sender: TObject);
begin
hhkNTKeyboard := 0; // 钩子句柄初值
end;procedure TMainForm.EnableBtnClick(Sender: TObject);
begin
// 挂上键盘钩子
//
hhkNTKeyboard := SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardFunc,
HInstance, 0);
if hhkNTKeyboard <> 0 then
Application.MessageBox('系统键盘钩子已经启动了!', '信息', 64)
else
Application.MessageBox('无法启动系统键盘钩子!', '错误', 16);
end;procedure TMainForm.DisableBtnClick(Sender: TObject);
begin
// 解除键盘钩子
//
if hhkNTKeyboard = 0 then
Application.MessageBox('系统键盘钩子已经被禁止了!', '警告', 48)
else
begin
UnhookWindowsHookEx(hhkNTKeyboard); // 卸载钩子
hhkNTKeyboard := 0;
Hook.CleanHookForm; // 此行代码与钩子无关,不要误解,是我自己的窗体清除
Application.MessageBox('成功卸载系统键盘钩子!', '信息', 64)
end;
end;procedure TMainForm.ExitBtnClick(Sender: TObject);
begin
Close;
end;procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := (hhkNTKeyboard = 0);
if not CanClose then
Application.MessageBox('请先卸载系统键盘钩子,然后再退出本程序!', '警告', 48);
end;procedure TMainForm.FormDestroy(Sender: TObject);
begin
if hhkNTKeyboard <> 0 then
begin
UnhookWindowsHookEx(hhkNTKeyboard);
hhkNTKeyboard := 0;
end;
Hook.CleanHookForm;
end;end.以上的代码在 NT 4.0 + SP3/Win 2000 下能捕获 Alt + Tab、Alt + ESC、Ctrl + ESC 这
样的组合键,而 Ctrl + Alt + Del 无法捕获。有兴趣的朋友自己研究一下又没有别的办
法,或是我的代码由否不妥之处。另外,NT 环境下用低级键盘钩子,只有在 NT 4.0 + SP3
以上的版本才有效,在 NT 4 + SP2 都是无效的。在 Win2000 下当然有效了。
只是不能捕获Ctrl + Alt + Del,继续啦!