屏蔽系统键序列

 
  1. unit RaKeyBlock;
  2. interface
  3. uses
  4.   SysUtils, Classes, windows, ShlObj, Registry, shellapi, Messages;
  5. type
  6.   TRaKeyBlock = class(TComponent)
  7.   private
  8.     fBCAD: Boolean;
  9.     fBAT: Boolean;
  10.     fBCE: Boolean;
  11.     fEnabled: Boolean;
  12.     fBAE: Boolean;
  13.     fBCR: Boolean;
  14.     fBCK: Boolean;
  15.     fBP: Boolean;
  16.     fBS: Boolean;
  17.     fCKC: Cardinal;
  18.     fBWA: Boolean;
  19.     fBCAE: Boolean;
  20.     procedure SetBCAD(const Value: Boolean);
  21.     procedure SetBAT(const Value: Boolean);
  22.     procedure SetBCE(const Value: Boolean);
  23.     procedure SetEnabled(const Value: Boolean);
  24.     procedure SetBAE(const Value: Boolean);
  25.     procedure SetBCK(const Value: Boolean);
  26.     procedure SetBCR(const Value: Boolean);
  27.     procedure SetBP(const Value: Boolean);
  28.     procedure SetBS(const Value: Boolean);
  29.     procedure SetBWA(const Value: Boolean);
  30.     procedure SetBCAE(const Value: Boolean);
  31.   protected
  32.   public
  33.     constructor Create(AOwner: TComponent); override;
  34.     destructor Destroy; override;
  35.   published
  36.     property BlockCtrlAltDelete: Boolean read fBCAD write SetBCAD;
  37.     property BlockAltTab: Boolean read fBAT write SetBAT;
  38.     property BlockCtrlEsc: Boolean read fBCE write SetBCE;
  39.     property BlockAltEsc: Boolean read fBAE write SetBAE;
  40.     property BlockCtrlEnter: Boolean read fBCR write SetBCR;
  41.     property BlockSleep: Boolean read fBS write SetBS;
  42.     property BlockPower: Boolean read fBP write SetBP;
  43.     property CustomKeyCode: Cardinal read fCKC write fCKC default 0;
  44.     property BlockCustomKey: Boolean read fBCK write SetBCK;
  45.     property BlockWinApps: Boolean read fBWA write SetBWA;
  46.     property BlockCtrlAltEnter: Boolean read fBCAE write SetBCAE;
  47.     property Enabled: Boolean read fEnabled write SetEnabled default false;
  48.   end;
  49. type
  50.   KBDLLHOOKSTRUCT = record
  51.     vkCode: DWORD;
  52.     scanCode: DWORD;
  53.     flags: DWORD;
  54.     Time: DWORD;
  55.     dwExtraInfo: DWORD; end;
  56.   PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
  57. const
  58.   LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
  59.   WH_KEYBOARD_LL = 13;
  60. var
  61.   hhkNTKeyboard: HHOOK = 0;
  62.   KH:TRaKeyBlock;
  63.   aBCAD:boolean=False;
  64.   aBWA:boolean=False;
  65.   aBCE:boolean=False;
  66.   aBAT:boolean=False;
  67.   aBAE:boolean=False;
  68.   aBCR:boolean=False;
  69.   aBCAE:boolean=False;
  70.   aBP:boolean=False;
  71.   aaBS:boolean=False;
  72.   aBCK:boolean=False;
  73.   aCKC:Cardinal=0;
  74. procedure Register;
  75. implementation
  76. procedure Register;
  77. begin
  78.   RegisterComponents('Rarnu Components', [TRaKeyBlock]);
  79. end;
  80. { TRaKeyBlock }
  81. constructor TRaKeyBlock.Create(AOwner: TComponent);
  82. begin
  83.   inherited Create(AOwner);
  84. end;
  85. procedure EnableCTRLALTDEL(YesNo: Boolean);
  86. const
  87.   sRegPolicies = '/Software/Microsoft/Windows/CurrentVersion/Policies';
  88. begin
  89.   with TRegistry.Create do
  90.   try
  91.     RootKey := HKEY_CURRENT_USER;
  92.     if OpenKey(sRegPolicies + '/System/', True) then
  93.     begin
  94.       case YesNo of
  95.         false:
  96.           begin
  97.             WriteInteger('DisableTaskMgr'1); //任务管理
  98.             WriteInteger('DisableLockWorkstation'1); //用户锁定计算机
  99.             WriteInteger('DisableChangePassword'1); //用户更改口令
  100.           end;
  101.         True:
  102.           begin
  103.             WriteInteger('DisableTaskMgr'0);
  104.             WriteInteger('DisableLockWorkstation'0);
  105.             WriteInteger('DisableChangePassword'0);
  106.           end;
  107.       end;
  108.     end;
  109.     CloseKey;
  110.     if OpenKey(sRegPolicies + '/Explorer/', True) then
  111.     begin
  112.       case YesNo of
  113.         false:
  114.           begin
  115.             WriteInteger('NoChangeStartMenu'1); //开始菜单
  116.             WriteInteger('NoClose'1); // 关闭系统菜单
  117.             WriteInteger('NoLogOff'1); //注销菜单
  118.             WriteInteger('NoRun'1); //运行菜单
  119.             WriteInteger('NoSetFolders'1); //设置菜单
  120.           end;
  121.         True:
  122.           begin
  123.             WriteInteger('NoChangeStartMenu'0);
  124.             WriteInteger('NoClose'0);
  125.             WriteInteger('NoLogOff'0);
  126.             WriteInteger('NoRun'0);
  127.           end;
  128.       end;
  129.     end;
  130.     CloseKey;
  131.   finally
  132.     Free;
  133.   end;
  134. end;
  135. function LowLevelKeyboardFunc(nCode: INTEGER; w_Param: WPARAM;
  136.   l_Param: LPARAM): LRESULT; stdcall;
  137. var
  138.   boolKey: Boolean;
  139.   p: PKBDLLHOOKSTRUCT;
  140. const
  141.   VK_SLEEP = $5F;
  142.   VK_POWER = $5E;
  143. begin
  144.   boolKey := false;
  145.   if nCode = HC_ACTION then
  146.   begin
  147.     case w_Param of
  148.       WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP:
  149.         begin
  150.           p := PKBDLLHOOKSTRUCT(l_Param);
  151.       //---------!-~------------------------------------------------
  152.       {    if ((GetAsyncKeyState(VK_RBUTTON) and $8000) <> 0) then boolKey := true;
  153.           if (CHAR(p.vkCode) >= '!') and (CHAR(p.vkCode) <= '~') and
  154.             ((GetKeyState(VK_CONTROL) and $8000) <> 0) then boolKey := true;
  155.           if (p.vkCode = VK_SPACE) and
  156.             ((GetKeyState(VK_CONTROL) and $8000) <> 0) then boolKey := true;    }
  157.       //---------F1-F12 ----------------------------------------------
  158.       {    if (p.vkCode = VK_F1) or (p.vkCode = VK_F2) or (p.vkCode = VK_F3) or
  159.             (p.vkCode = VK_F4) or (p.vkCode = VK_F5) or (p.vkCode = VK_F6) or
  160.             (p.vkCode = VK_F7) or (p.vkCode = VK_F8) or (p.vkCode = VK_F9) or
  161.             (p.vkCode = VK_F10) or (p.vkCode = VK_F11) or (p.vkCode = VK_F12) then boolKey := true;
  162.           if ((p.vkCode = VK_F1) or (p.vkCode = VK_F2) or (p.vkCode = VK_F3) or
  163.             (p.vkCode = VK_F4) or (p.vkCode = VK_F5) or (p.vkCode = VK_F6) or
  164.             (p.vkCode = VK_F7) or (p.vkCode = VK_F8) or (p.vkCode = VK_F9) or
  165.             (p.vkCode = VK_F10) or (p.vkCode = VK_F11) or (p.vkCode = VK_F12)) and
  166.             (((GetKeyState(VK_MENU) and $8000) <> 0) or ((GetKeyState(VK_CONTROL) and $8000) <> 0) or ((GetKeyState(VK_SHIFT)and$8000) <> 0)) then boolKey := true; }
  167.       //-------系统热键---------------------------------------------
  168.       //WIN(Left or Right)+APPS
  169.           if aBWA then
  170.           begin
  171.             if (p.vkCode = VK_LWIN) or (p.vkCode = VK_RWIN) or (p.vkCode = VK_APPS) then boolKey := True;
  172.           end;
  173.       //CTRL+ESC
  174.           if aBCE then
  175.           begin
  176.             if (p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0then boolKey := True;
  177.           end;
  178.       //ALT+TAB
  179.           if aBAT then
  180.           begin
  181.             if (p.vkCode = VK_TAB) and ((GetAsyncKeyState(VK_MENU) and $8000) <> 0then boolKey := True;
  182.           end;
  183.       //ALT+ESC
  184.           if aBAE then
  185.           begin
  186.             if (p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0then boolKey := True;
  187.           end;
  188.       //CTRL+ENTER
  189.           if aBCR then
  190.           begin
  191.             if (p.vkCode = VK_RETURN) and ((GetKeyState(VK_CONTROL) and $8000) <> 0then boolKey := True;
  192.           end;
  193.       //CTRL+ALT+ENTR
  194.           if aBCAE then
  195.           begin
  196.             if (p.vkCode = VK_RETURN) and ((p.flags and LLKHF_ALTDOWN) <> 0and ((GetKeyState(VK_CONTROL) and $8000) <> 0then boolKey := True;
  197.           end;
  198.       //POWER
  199.           if aBP then
  200.           begin
  201.             if (p.vkCode = VK_POWER) then boolKey := True;
  202.           end;
  203.       //SLEEP
  204.           if aaBS then
  205.           begin
  206.             if (p.vkCode = VK_SLEEP) then boolKey := True;
  207.           end;
  208.       //-------------------------------------------------------------------------------------------------------------------------------------
  209.       //Custom
  210.           if aBCK then
  211.           begin
  212.             if (p.vkCode = aCKC) then boolKey := True;
  213.           end;
  214.       //-------------------------------------------------------------------------------------------------------------------------------------
  215.        //如果有其他要屏闭的键,添加在此处
  216.         end;
  217.     end;
  218.   end;
  219.   //捕获这些组合键,按键消息由自己处理,必须返回 1
  220.   if boolKey then begin Result := 1; Exit end;
  221.   //其他的按键,交由别的线程处理(过滤)
  222.   Result := CallNextHookEx(0, nCode, w_Param, l_Param);
  223. end;
  224. destructor TRaKeyBlock.Destroy;
  225. begin
  226.   Enabled:=false;
  227.   inherited Destroy;
  228. end;
  229. procedure TRaKeyBlock.SetBAE(const Value: Boolean);
  230. begin
  231.   fBAE := Value;
  232.   aBAE:=fBAE;
  233.   Enabled := false;
  234. end;
  235. procedure TRaKeyBlock.SetBAT(const Value: Boolean);
  236. begin
  237.   fBAT := Value;
  238.   aBAT:=fBAT;
  239.   Enabled := false;
  240. end;
  241. procedure TRaKeyBlock.SetBCAD(const Value: Boolean);
  242. begin
  243.   fBCAD := Value;
  244.   aBCAD:=fBCAD;
  245.   Enabled := false;
  246. end;
  247. procedure TRaKeyBlock.SetBCAE(const Value: Boolean);
  248. begin
  249.   fBCAE := Value;
  250.   aBCAE:=fBCAE;
  251.   Enabled := false;
  252. end;
  253. procedure TRaKeyBlock.SetBCE(const Value: Boolean);
  254. begin
  255.   fBCE := Value;
  256.   aBCE:=fBCE;
  257.   Enabled := false;
  258. end;
  259. procedure TRaKeyBlock.SetBCK(const Value: Boolean);
  260. begin
  261.   fBCK := Value;
  262.   aBCK:=fBCK;
  263.   Enabled := false;
  264. end;
  265. procedure TRaKeyBlock.SetBCR(const Value: Boolean);
  266. begin
  267.   fBCR := Value;
  268.   aBCR:=fBCR;
  269.   Enabled := false;
  270. end;
  271. procedure TRaKeyBlock.SetBP(const Value: Boolean);
  272. begin
  273.   fBP := Value;
  274.   aBP:=fBP;
  275.   Enabled := false;
  276. end;
  277. procedure TRaKeyBlock.SetBS(const Value: Boolean);
  278. begin
  279.   fBS := Value;
  280.   aaBS:=fBS;
  281.   Enabled := false;
  282. end;
  283. procedure TRaKeyBlock.SetBWA(const Value: Boolean);
  284. begin
  285.   fBWA := Value;
  286.   aBWA:=fBWA;
  287.   Enabled := false;
  288. end;
  289. procedure TRaKeyBlock.SetEnabled(const Value: Boolean);
  290. begin
  291.   fEnabled := Value;
  292.   //设置可用
  293.   case fEnabled of
  294.     True:
  295.       begin
  296.         if hhkNTKeyboard <> 0 then Exit;
  297.         hhkNTKeyboard := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardFunc, HInstance, 0);
  298.         if fBCAD then
  299.         begin
  300.           EnableCTRLALTDEL(false);
  301.           SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nilnil);
  302.         end;
  303.       end;
  304.     false:
  305.       begin
  306.         if hhkNTKeyboard = 0 then Exit;
  307.         UnhookWindowsHookEx(hhkNTKeyboard); // 卸载钩子
  308.         EnableCTRLALTDEL(true);
  309.         SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nilnil);
  310.         hhkNTKeyboard := 0;
  311.       end;
  312.   end;
  313. end;
  314. end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值