📄 ukeyhook.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 + -