怎么才能实现锁定桌面?不让ALT+TAB起作用?

sea_way 2003-08-26 09:48:14
用DELPHI怎么实现怎么才能实现锁定桌面?不让ALT+TAB CTRL+ALT+DEL起作用?
2000/XP系统.DELPHI7开发环境
...全文
298 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sea_way 2003-08-28
  • 打赏
  • 举报
回复
MSDN上的文章标题为HOWTO: Disable Task Switching on Win32 Platforms
的文章说,这个方法不能禁止CTRL+ALT+DEL
sea_way 2003-08-28
  • 打赏
  • 举报
回复
谢谢你老大.
dickeybird888 2003-08-27
  • 打赏
  • 举报
回复
unit Main;

interface

uses
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;

implementation

uses 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
sea_way 2003-08-27
  • 打赏
  • 举报
回复
各位高手帮忙啊.谢谢啦

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧