用DELPHI怎么实现怎么才能实现锁定桌面?不让ALT+TAB CTRL+ALT+DEL起作用?
2000/XP系统.DELPHI7开发环境
2000/XP系统.DELPHI7开发环境
解决方案 »
- 简单问题,如何解?----ComboBox
- Delphi操作Excel的保存问题,请高手指教!
- 分发软件时,需要将msvcr71.dll复制到system32目录下,可是这个文件有可能已存在,也有可能该文件存在别的目录下,
- 哪位朋友有完整的 《Delphi Developer’s Guide to COM+》 Alexander Rodygin
- 对indyTCPClient的简单VCL化,但是总发觉有点不对。求高手的修改。
- 用什么方法可将一个ACCESS库中一个表的数据追加到另一个一个ACCESS库中另一个表中
- 有关子窗体的一个问题。
- 谁有各组件属性、参数等的详细资料
- [学习&讨论] B/S结构系统的设计方案
- 我的MIDAS程序,本机可以,客户程序拷到另外机器上就不行了! 我爱你们!!!
- 程序中多处需要用到高级查询,代码如何封装好?
- 一个极简单的问题 我想在unit3单元中调用Unit1中的对象,怎么声明时总是有问题,应该怎么办
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.
捕获 Alt + Tab、Alt + ESC、Ctrl + ESC
的文章说,这个方法不能禁止CTRL+ALT+DEL