在XP系统下怎么屏蔽系统热键呢?
比如ctrl+esc,alt_tab,ctrl+shift+del...注意是XP系统!!

解决方案 »

  1.   

    转贴:
    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 下当然有效了。
      

  2.   

    谢谢啊!
    只是不能捕获Ctrl + Alt + Del,继续啦!
      

  3.   

    Ctrl + Alt + Del是NT系统内核控制的热键,如果被轻易截获,就谈不上什么安全性了 :-)否则有人写程序模拟锁定界面,会截获密码的。
      

  4.   

    CTRL+ALT+DEL在较高的级别被捕获,所以很难流到你的那一级.