//该例程为在系统级屏蔽一些系统键、如WIN、TAB、CAP、POWER、SLEEP、HOME等!
//屏蔽组合键下面例程不适用!(比如CTRL+ESC需要在钩子函数中用(p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $) <> )进行判断,也不难,这里只是举个简单的例子)
unit KeyBlocker; interface uses
SysUtils, Classes, Windows, Messages; const
WH_KEYBOARD_LL = ; type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = packed record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end; TBlockKeyEvent = procedure(VirtualKey: Cardinal) of object; TKeyBlocker = class
private
FEnabled: Boolean;
FCustomKey:Cardinal;
FOnBlockKey: TBlockKeyEvent;
procedure SetEnabled(const Value: Boolean);
procedure SetCustomKey(const Value: Cardinal);
procedure DoBlock(VirtualKey: Cardinal);
procedure UpdateKeyBlock;
public
constructor Create;
destructor Destroy; override;
property CustomKey: Cardinal read FCustomKey write SetCustomKey default ;
property Enabled: Boolean read FEnabled write SetEnabled default False;
property OnBlockKey: TBlockKeyEvent read FOnBlockKey write FOnBlockKey;
end; implementation { TKeyBlocker } var
KeyboardHook: HHOOK = ;
FKeyBlocker: TKeyBlocker = nil;//设计这一变量的作用就是能在LowLevelfunction中访问类成员变量!
//LowLevelfunction为系统回调函数,为确保在系统调用时存在,就必须把之设计为一个类函数或静态函数,使之在编译期就能生成地址,如果设计为虚函数,系统就晕了 constructor TKeyBlocker.Create;
begin
inherited;
FKeyBlocker := Self;
end; destructor TKeyBlocker.Destroy;
begin
Enabled := False;
FKeyBlocker := nil;
inherited;
end; procedure TKeyBlocker.DoBlock(VirtualKey: Cardinal);
begin
if Assigned(FOnBlockKey) then
FOnBlockKey(VirtualKey);
end; procedure TKeyBlocker.SetCustomKey(const Value: Cardinal);
begin
FCustomKey := Value;
end; procedure TKeyBlocker.SetEnabled(const Value: Boolean);
begin
FEnabled := Value;
UpdateKeyBlock;
end;
//核心部分
function LowLevelKeyboardFunc(nCode: INTEGER; w_Param: WPARAM;
l_Param: LPARAM): LRESULT; stdcall;
var
boolKey: Boolean;
p: PKBDLLHOOKSTRUCT;
begin
boolKey := False;
p := nil;
if nCode = HC_ACTION then
begin
case w_Param of
WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP:
begin
p := PKBDLLHOOKSTRUCT(l_Param);
if (p.vkCode = FKeyBlocker.FCustomKey) then
boolKey := True;
end;
end;
end; if boolKey and (p <> nil) then
begin
FKeyBlocker.DoBlock(p.vkCode);
Result := ;
Exit;
end; Result := CallNextHookEx(, nCode, w_Param, l_Param);
end;
//装载hook与卸载hook
procedure TKeyBlocker.UpdateKeyBlock;
begin
if KeyboardHook <> then Exit;
case FEnabled of
True:
KeyboardHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardFunc, HInstance, );
False:
UnhookWindowsHookEx(KeyboardHook);
end;
end; end.
----------------------------------------------------------------
//调用程序 procedure BlockProc(VirtualKey: Cardinal);
begin
//to do ..
end;
procedure TForm1.btn1Click(Sender: TObject);
var
KeyBlockerTest:TKeyBlocker;
begin
KeyBlockerTest:=TKeyBlocker.Create;
KeyBlockerTest.CustomKey:=VK_CAPITAL;
KeyBlockerTest.OnBlockKey:=BlockProc;
KeyBlockerTest.Enabled:=true;
end;

[Windows Hook] 屏蔽键盘按键的更多相关文章

  1. js屏蔽键盘按键

    3.1屏蔽键盘所有键 <script language="javascript"> <!-- function document.onkeydown(){ eve ...

  2. C# 获取键盘钩子,屏蔽键盘按键

    static int hHook = 0; public delegate int HookProc(int nCode, int wParam, IntPtr lParam); //LowLevel ...

  3. 钩子编程(HOOK) 屏蔽全部按键、鼠标及系统功能键 (4)

    摘要:上篇文章<钩子编程(HOOK) 安装系统全局钩子>已经具体的解说了全局钩子的安装.本文将增强一下钩子的功能.实现屏蔽全部按键鼠标与系统功能键.要实现这个功能.须要安装两个全局钩子,& ...

  4. windows hook + pyhook3 + python win32api hook + C 键盘hook

    安装pyhook3见:https://www.cnblogs.com/lqerio/p/12096710.html 使用见:https://www.cnblogs.com/lqerio/p/12106 ...

  5. windows系统下修改键盘按键的映射

    待解决的问题: 在windows系统下,在某些情况下,我们感觉键盘的按键位置不是特别方便,因此想重新映射它. 比如:要实现如下重新映射(我就有这样的需求),怎么办? Esc键 修改为 CapsLock ...

  6. python 模拟windows键盘按键的封装

    代码:在执行的时候,把光标放在指定的地方,在此例中,点击运行后把光标放到结果区域,粘贴的时候是粘贴到光标所在的问题,如过是运行脚本在web元素输入框中输入的话,不能移动光标到其他位置 #encodin ...

  7. python 在windows下监听键盘按键

    python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...

  8. JS实现屏蔽键盘操作

    第一种:当页面初始加载的时候,屏蔽掉当前页面所有的键盘 $(document).ready(function () { document.body.onkeydown = function (even ...

  9. UI自动化测试(四)AutoIT工具使用和robot对象模拟键盘按键操作

    AutoIT简介 AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/ ...

随机推荐

  1. 易混点总结--JS

    1.defer与 async 的区别是: defer要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行:async一旦下载完,渲染引擎就会中断渲染,执行这个脚本 ...

  2. 基于区域的OSPF简单认证

    实验要求:掌握OSPF区域简单认证配置 拓扑如下: 配置如下: R1enable configure terminal interface s0/0/0ip address 192.168.1.1 2 ...

  3. 【转载】 Caffe BN+Scale层和Pytorch BN层的对比

    原文地址: https://blog.csdn.net/elysion122/article/details/79628587 ------------------------------------ ...

  4. Blender 简单齿轮驱动

    直入主题. 1. 用户设置里,勾选扩展网格(Add Mesh: Extra Objects):这样可以直接新增简单齿轮了,免得自己再造轮子. 2. 新增2个齿轮,12赤为主动轮,驱动24赤的被动轮: ...

  5. 【分布式事务】阿里fescar

    一.什么是Fescar FESCAR(Fast & Easy Commit And Rollback) 是一个用于微服务架构的分布式事务解决方案,它的特点是高性能且易于使用,旨在实现简单并快速 ...

  6. hibernate中带查询条件的分页

    所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件. 分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select ...

  7. lerna import && add 使用&&常见问题解决

    使用lerna 的import 我们可以方便的将一个普通的npm 包倒入到lerna 管理的monorepo 中 环境准备 lerna init 注意必须是一个git 项目,同时需要commit ,不 ...

  8. 深入理解计算机系统 (Randal E.Bryant / David O'Hallaron 著)

    第1章 计算机系统漫游 (已看) 1.1 信息就是位+上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释存储在内存中的指令 1.4.1 系 ...

  9. count(*) 和 count(1)和count(列名)区别

    执行效果上:  count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  count(1)包括了所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  cou ...

  10. java BitSet2

    15. int nextClearBit(int startIndex)返回第一个设置为 false 的位的索引,这发生在指定的起始索引或之后的索引上. 16. int nextSetBit(int ...