做好有代码。谢谢!

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Registry;//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义  
    const   WH_KEYBOARD_LL   =   13;
    //定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下
    const   LLKHF_ALTDOWN   =   $20;
    type
      tagKBDLLHOOKSTRUCT = packed record
        vkCode:   DWORD;//虚拟键值
        scanCode:   DWORD;//扫描码值(没有用过)
        {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
        根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}
        flags:   DWORD;
        time:   DWORD;//消息时间戳
        dwExtraInfo:   DWORD;//和消息相关的扩展信息
      end;
      KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
      PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        Hwnd:THandle;    Tmp:integer;
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      HookHandle: HHook;
      hhkLowLevelKybd:   HHOOK;
    implementation
    procedure DisableTaskMgr(bTF: Boolean);
    var
      reg: TRegistry;
    begin
      reg := TRegistry.Create;
      reg.RootKey := HKEY_CURRENT_USER;  reg.OpenKey('Software', True);
      reg.OpenKey('Microsoft', True);
      reg.OpenKey('Windows', True);
      reg.OpenKey('CurrentVersion', True);
      reg.OpenKey('Policies', True);
      reg.OpenKey('System', True);  if bTF = True then
      begin
        reg.WriteString('DisableTaskMgr', '1');
      end
      else if bTF = False then
      begin
        reg.DeleteValue('DisableTaskMgr');
      end;
      reg.CloseKey;
    end;
    {$R *.dfm}
    {
      功能:低级键盘钩子的回调函数,在里面过滤消息
      参数:nCode   是Hook的标志
      WParam   表示消息的类型
      LParam   是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针
      返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。
      }
    function GetHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
    var
      fEatKeystroke: BOOL;
      p: PKBDLLHOOKSTRUCT;
    begin
      Result:= 0;
      fEatKeystroke:= FALSE;
      p:= PKBDLLHOOKSTRUCT(lParam);
      //nCode值为HC_ACTION时表示WParam和LParam参数包涵了按键消息
      if (nCode = HC_ACTION) then
      begin
        //拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab、和Alt+Esc功能键。
        case wParam of
          WM_KEYDOWN,
          WM_SYSKEYDOWN,
          WM_KEYUP,
          WM_SYSKEYUP:
          fEatKeystroke:=
          ((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or   //   Alt+Tab
          ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0))or   //
          (p.vkCode = VK_Lwin) or (p.vkCode = VK_Rwin)or (p.vkCode = VK_apps) or     //上面是屏蔽WIN按键
          //((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN) and (P.vkCode = VK_Delete)) or
          ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
          ((p.vkCode = VK_F4) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
          ((p.vkCode = VK_SPACE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) OR
          (((p.vkCode = VK_CONTROL) and (P.vkCode = LLKHF_ALTDOWN and p.flags) and (P.vkCode = VK_Delete)))   //AND   (p.flags   =   true)   ;
        end;
      end;  if fEatKeystroke = True then
        Result:= 1;
      if nCode <> 0 then
        Result:= CallNextHookEx(0, nCode, wParam, lParam);
    end;procedure hookstar;   //设置钩子
    begin
      //设置键盘钩子
      if hhkLowLevelKybd = 0 then
      begin
        hhkLowLevelKybd:= SetWindowsHookExW(WH_KEYBOARD_LL,GetHookProc,Hinstance,0);
        if hhkLowLevelKybd <> 0 then
          MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK)
        else
          MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK);
      end
      else
        MessageBox(0, '键盘钩子已设置!', '提示', MB_OK);
    end;procedure hookend;//卸载键盘钩子
    begin
      if hhkLowLevelKybd <> 0 then
        if UnhookWindowsHookEx(hhkLowLevelKybd) <> False then
        begin
          MessageBox(0, '系统热键恢复使用!', '提示', MB_OK);
          hhkLowLevelKybd   :=   0;
        end
        else
          MessageBox(0, '键盘钩子卸载失败!', '提示', MB_OK)
      else
        MessageBox(0, '没有发现键盘钩子!', '提示', MB_OK);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin  Hwnd:=FindWindow('Shell_TrayWnd',nil);
      if Hwnd<>0 then ShowWindow(Hwnd,SW_HIDE); //隐藏任务栏
      hookstar;
      DisableTaskMgr( true );
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin  
      Hwnd:=FindWindow('Shell_TrayWnd',nil);
      ShowWindow(Hwnd,SW_SHOW); //恢复任务栏
      hookend;
      DisableTaskMgr( false );
    end;end.