//该例程为在系统级屏蔽一些系统键、如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. 顶部BANNER

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 20165228 实验一 Java开发环境的熟悉

    20165228 实验一 Java开发环境的熟悉 一.实验内容及步骤 (一)使用JDK编译.运行简单的Java程序 命令行下Java程序开发 1.用VrtualBox打开Linux虚拟机 2.使用Al ...

  3. ERROR: gnu-config-native-20150728+gitAUTOINC+b576fa87c1-r0 do_unpack: Function failed: Fetcher failure: Fetch command failed with exit code 128, output: fatal: the '--set-upstream' option is no longer

    /********************************************************************** * ERROR: gnu-config-native-2 ...

  4. 【opencv基础】OpenCV installation stuck at [ 98%] Built target opencv_perf_stitching with no error

    前言 按照官网步骤安装opencv的过程中进行到98%时一直没有继续进行. 原因 后台一直在编译运行,只需等待即可,参考here: well, turns out it gets stuck for ...

  5. apache 和 php 整合、apache配制虚拟机

    如何 把apache 和 php 整合起来 ?   (关闭防火墙或在防火墙内添加80端口,关闭selinux)   修改:apache的配制文件:/usr/local/apache2.4/conf/h ...

  6. java-Integer类

    1.为什么会有基本类型包装类 * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. 2.常用操作 * 常用的操作之一:用于基本数据类型与字符串之间的转换. * Intege ...

  7. js的数据类型。

    字符串   String 数字    Number 布尔    Boolean Null     空 Undefined Object   对象  Array 数组   json   function ...

  8. qduoj LC的课后辅导

    描述 有一天,LC给我们出了一道题,如图: 这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积. 输入 多组测试数据每组测试数据的第一行为n(0 <= n ...

  9. <jsp:include>动作元素,附:最易出错的一点

    先定义一个date.jsp,再定义一个main.jsp.用<jsp:include plage = "相对url地址" flush = "true"> ...

  10. root用户登录mysql后新建用户提示1045错误

    执行以下命令查看root权限 show grants for 'root'@'localhost'; 如果没有显示with grant option,说明是root没有拥有新建授权用户的权限(为什么会 ...