⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unthook.pas

📁 实现了:自动锁屏
💻 PAS
字号:
unit UntHook;

interface   
    
uses   
Windows, Messages, SysUtils, Variants, Classes, Dialogs, StdCtrls;

{按键消息的结构,Delphi中没有。  注意:这个结构在Windows   NT   4   sp3以上系统 中才能使用}
type
  tagKBDLLHOOKSTRUCT = packed   record
  vkCode:   DWORD;    //虚拟键值
  scanCode:   DWORD;  //扫描码值(没有用过)
  {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
  根据这个程序,这个标志值的第六位数(二进制)为1时ALT键按下为0相反。}

  flags:   DWORD;
  time:   DWORD;      //消息时间戳
  dwExtraInfo: DWORD; //和消息相关的扩展信息
end;

KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
    
//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义   
const   WH_KEYBOARD_LL = 13;   
//定义一个常量好和上面哪个结构中的flags比较而得出ALT键是否按下   
const   LLKHF_ALTDOWN = $20;

//----声明各个函数-------------
function   LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
procedure   hookstar;   //设置钩子
procedure   hookend;

var   
hhkLowLevelKybd:   HHOOK;

implementation   
{   
功能:低级键盘钩子的回调函数,在里面过滤消息   
参数:nCode   是Hook的标志   
WParam   表示消息的类型   
LParam   是一个指向我们在上面定义的哪个结构KBDLLHOOKSTRUCT的指针   
返回值:如果不是0的话windows就把这个消息丢掉,程序就不会再收到这个消息了。   
}   
function LowLevelKeyboardProc(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, LowLevelKeyboardProc, Hinstance, 0);
    if   hhkLowLevelKybd <> 0   then
      //MessageBox(0, '键盘钩子设置成功!', '提示', MB_OK)
    else
      //  MessageBox(0, '键盘钩子设置失败!', '提示', MB_OK);
    end
  else
      //MessageBox(Handle, '键盘钩子已设置!', '提示', 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(Handle, '键盘钩子卸载失败!', '提示', MB_OK)
  else
    //MessageBox(Handle, '没有发现键盘钩子!', '提示', MB_OK);
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -