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

📄 ukeyhook.pas

📁 一个简单的开机保护程序 无任何控件 全api编写 关键字 :键盘钩子
💻 PAS
字号:
unit uKeyHook;

interface

uses
  Windows;

type
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
  KBDLLHOOKSTRUCT = record
    vkCode     : DWORD;
    ScanCode   : DWORD;
    Flags      : DWORD;
    Time       : DWORD;
    dwExtraInfo: DWORD;
  end;

const
  WM_KEYDOWN          = $0100;
  WM_SYSKEYDOWN       = $0104;
  WM_KEYUP            = $0101;
  WM_SYSKEYUP         = $0105;
  WM_GETTEXTLENGTH    = $000E;
  EM_SETSEL           = $00B1;
  EM_REPLACESEL       = $00C2;
  WM_GETTEXT          = $000D;
  VK_S                = $0053;
  LLKHF_ALTDOWN       = KF_ALTDOWN shr 8;
  AlTIsDownFlags      = $20;

var
  hHk     : HHOOK;

  function SetPrivilege(sPrivilegeName: string; bEnabled: boolean): boolean;
  function EnableHook: Boolean; stdcall;
  function DisableHook: Boolean; stdcall;
  function ShutDown(AType : Integer): Boolean;
  
implementation

{回调函数}
function keyHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
  p: PKBDLLHOOKSTRUCT;
  y: integer;
begin
  if nCode < 0 then
    Result:= CallNextHookEx(hHk,nCode,WParam,LParam)
  else
  begin
    y := 0;
    case WParam of
      WM_KEYDOWN,WM_SYSKEYDOWN, {按键}
      WM_KEYUP,WM_SYSKEYUP:     {松开按键}
        begin
          p:=PKBDLLHOOKSTRUCT(Lparam);
                                                         {WIN键,TAB+Alt}
          if (p^.vkCode = VK_LWIN) or (p^.vkCode = VK_RWIN) or
            ((p^.vkCode = VK_TAB) and ((p^.Flags and AlTIsDownFlags) <> 0)) or
            ((p^.vkCode = VK_ESCAPE) and ((p^.Flags and AlTIsDownFlags) <> 0)) or
            ((p^.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0)) or
            ((p^.vkCode = VK_DELETE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0) and
             ((p^.Flags and AlTIsDownFlags) <> 0)) or
            ((p^.vkCode = VK_F4) and ((p^.Flags and AlTIsDownFlags) <> 0)) then
            y := 1;

          if (((p^.vkCode = VK_S) and ((p^.flags and LLKHF_ALTDOWN) <> 0)) or
              ((p^.vkCode = VK_RETURN) and ((GetKeyState(VK_CONTROL) and $8000) <> 0))) then
            y := 2;
        end;
    end;
    case y of
      1 :  Result := 1;        {如果为WIN功能键则屏蔽}
      2 :  Result := 0;
      else
        Result := CallNextHookEx(hHk, nCode, WParam, LParam); {其他键放下一个钩子}
    end
  end
end;

function EnableHook: Boolean; stdcall; export;
begin
  if hHk = 0 then
  begin
    hHk    := SetWindowsHookEx(13,@keyHookProc,HInstance,0);
    Result := True;
  end
  else
    Result := False;
end;

function DisableHook: Boolean; stdcall; export;
begin
  if hHk <> 0 then
  begin
    UnHookWindowsHookEx(hHk);
    hHk    := 0;
    Result := True;
  end
  else
    Result := False;
end;

function GetOperatingSystem: Integer;  {判断系统类型}
var
  osVerInfo: TOSVersionInfo;
begin
  Result := 2;
  osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then Result := osVerInfo.dwPlatformId;
end;

function SetPrivilege(sPrivilegeName: string; bEnabled: boolean): boolean;
var
  TPPrev,TP : TTokenPrivileges;
  Token     : THandle;
  dwRetLen  : DWord;
begin
  Result := False;
  OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token);
  TP.PrivilegeCount := 1;
  if LookupPrivilegeValue(nil, PChar(sPrivilegeName), TP.Privileges[0].LUID) then
  begin
    if bEnabled then
    begin
      TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    end
    else begin
      TP.Privileges[0].Attributes := 0;
    end;
    dwRetLen := 0;
    Result := AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);
  end;
  CloseHandle(Token);
end;

function WinExitInNT(iFlags: integer): boolean;
begin  Result := True;
  if SetPrivilege('SeShutdownPrivilege',True) then
  begin
    if not ExitWindowsEx(iFlags, 0) then
    begin
      Result := False;
    end;
    SetPrivilege('SeShutdownPrivilege',False)
  end
  else begin
    Result := False;
  end;
end;

function ShutDown(AType : Integer): Boolean;
begin
  case AType of
    0: begin
         if GetOperatingSystem = VER_PLATFORM_WIN32_WINDOWS then
           ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF, 32);
         if GetOperatingSystem = VER_PLATFORM_WIN32_NT then
           WinExitInNT(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF);
       end;
    1: begin
         if GetOperatingSystem = VER_PLATFORM_WIN32_WINDOWS then
           ExitWindowsEx(EWX_REBOOT, 32);
         if GetOperatingSystem = VER_PLATFORM_WIN32_NT then
           WinExitInNT(EWX_REBOOT);
       end;
    2: begin
         if GetOperatingSystem = VER_PLATFORM_WIN32_WINDOWS then
           ExitWindowsEx(EWX_LOGOFF, 32);
         if GetOperatingSystem = VER_PLATFORM_WIN32_NT then
           WinExitInNT(EWX_LOGOFF);
       end;
  end;
  Result := True;
end;

end.
 

⌨️ 快捷键说明

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