全局键盘钩子(WH_KEYBOARD)
为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找。
KeyBoardHook.dll代码
- library KeyBoardHook;
- { Important note about DLL memory management: ShareMem must be the
- first unit in your library's USES clause AND your project's (select
- Project-View Source) USES clause if your DLL exports any procedures or
- functions that pass strings as parameters or function results. This
- applies to all strings passed to and from your DLL--even those that
- are nested in records and classes. ShareMem is the interface unit to
- the BORLNDMM.DLL shared memory manager, which must be deployed along
- with your DLL. To avoid using BORLNDMM.DLL, pass string information
- using PChar or ShortString parameters. }
- uses
- SysUtils,Windows,Messages,
- Classes;
- var
- fHook:HHOOK;
- //执行挂钩程序的窗体句柄
- CallHandle:HWND;
- {$R *.res}
- //回调过程
- function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
- var
- processid:Cardinal;
- begin
- //如果有键盘动作
- if code = HC_Action then
- begin
- //获取注入进程的进程id
- processid := GetCurrentProcessId;
- //如果CallHandle,则查找TestMain窗体句柄
- if CallHandle = 0 then
- CallHandle := FindWindow(nil,'TestMain');
- //获取按键状态 小于0表示按下,如果不做判断,按键按下或抬起都会执行SendMessage
- //下面发送WM_USER+101消息,此消息可以用自定义的消息标识发送
- if GetKeyState(wParam) < 0 then
- SendMessage(CallHandle,WM_USER+101,wParam,processid);
- end
- else
- //下一个钩子
- Result := CallNextHookEx(fHook,code,wParam,lParam);
- end;
- procedure SetHook;stdcall;
- begin
- //挂钩,这里没有做挂钩失败的提示
- fHook := SetWindowsHookEx(WH_KEYBOARD,@HookProc,HInstance,0);
- end;
- procedure StopHook;stdcall;
- begin
- //摘钩
- if fHook <> 0 then
- UnhookWindowsHookEx(fHook);
- end;
- exports
- SetHook name 'SetHook',
- StopHook name 'StopHook';
- begin
- //初始CallHandle为0
- CallHandle := 0;
- end.
TestKeyBoardHook主程序代码
- {
- 此窗体用来执行挂钩,为了方便起见,我们把系统的按键返回到该窗体的Memo组件中进行
- 显示,所以在dll中,做了获取主窗体的句柄的工作,以便发消息给主窗体,告诉它是哪个
- 按键被按下
- }
- unit TestMain;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls,TlHelp32;
- type
- TfrmTestMain = class(TForm)
- Memo1: TMemo;
- btn_SetHook: TButton;
- btn_StopHook: TButton;
- procedure btn_SetHookClick(Sender: TObject);
- procedure btn_StopHookClick(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- private
- { Private declarations }
- procedure WndProc(var Message: TMessage);override;
- public
- { Public declarations }
- end;
- var
- frmTestMain: TfrmTestMain;
- implementation
- procedure SetHook;stdcall;external 'KeyBoardHook';
- procedure StopHook;stdcall;external 'KeyBoardHook';
- {$R *.dfm}
- procedure TfrmTestMain.btn_SetHookClick(Sender: TObject);
- begin
- SetHook;
- end;
- procedure TfrmTestMain.btn_StopHookClick(Sender: TObject);
- begin
- StopHook;
- end;
- procedure TfrmTestMain.WndProc(var Message: TMessage);
- var
- hSnapShot:THandle;
- pEntry:TProcessEntry32;
- find:Boolean;
- proName:string;
- begin
- if Message.Msg = WM_USER+101 then
- begin
- //创建进程快照
- hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- pEntry.dwSize := SizeOf(pEntry);
- find := Process32First(hSnapShot,pEntry);
- while find do
- begin
- //取进程名字
- proName := pEntry.szExeFile;
- if pEntry.th32ProcessID = Message.LParam then Break;
- find := Process32Next(hSnapShot,pEntry);
- end;
- Memo1.Lines.Add('进程:' + proName + ',ID:' +IntToStr(Message.LParam)+'按下按键:'+Chr(Message.WParam));
- CloseHandle(hSnapShot);
- end;
- inherited;
- end;
- procedure TfrmTestMain.FormClose(Sender: TObject;
- var Action: TCloseAction);
- begin
- StopHook;
- end;
- end.
运行结果

http://blog.csdn.net/bdmh/article/details/6124127
全局键盘钩子(WH_KEYBOARD)的更多相关文章
- [转载] 全局键盘钩子(WH_KEYBOARD)
为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...
- 使用raw input 代替全局键盘钩子
//关于raw input 请查看msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536%28v=vs.85%29 ...
- c#-全局键盘钩子
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...
- 【VB6】全局键盘钩子
基本也没啥好说的,不要用到木马及恶意程序中是以前从VB.NET程序改到VB6的,阉割了一些功能,只提供键盘Hook功能想要截获热键可以在处理函数中返回1,里面有示例 下载地址 http://pan.b ...
- C#简单鼠标键盘钩子KMHook
简介:由三个文件构成Pinvo.cs.KeyboardHook.cs.MouseHook.cs Pinvo.cs 是KeyboardHook与MouseHook需要的一些常量消息的定义 Keyboar ...
- 2.添加键盘钩子。向进程中注入dll
学习笔记 1.首先要建立mfc的动态链接库.在def文件中放入要导出的函数名. 2.添加函数如下 //安装钩子 //HHOOK SetWindowsHookEx( // int idHook,//钩子 ...
- C#实现键盘钩子
前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...
- C#鼠标键盘钩子
using System;using System.Collections.Generic; using System.Reflection; using System.Runtime.Interop ...
- C#全局键盘监听(Hook)
一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
随机推荐
- Python: xml转json
1,引言 GooSeeker早在9年前就开始了Semantic Web领域的产品化,MS谋数台和DS打数机是其中两个产品.对web内容做结构化转换和语义处理的主要路线是 XML -> RDF - ...
- How Many Tables(并查集)
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 补丁惹的祸-ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出 问题: 重新安装了VS2012,结 ...
- SQL Server 对dbcc checkdb的优化
方法 1. 在运行dbcc checkdb前对数据库进行快照(事务是一致的),dbcc 对快照进行检测,dbcc完成后删除快照. 做快照的目的是为了不要让dbcc 申请太多的锁,从这里可以看出dbcc ...
- NHbiernate 配置
1.从网上下载NHibernate 4.0 文件.下载地址:https://sourceforge.net/projects/nhibernate/ 2.解压后把 NHibernate.dll文件引用 ...
- IE9 "CSS 因 Mime 类型不匹配而被忽略“问题
写页面的时候在chrome,fireforks等页面上显示正常,但是换成IE9之后就完全没有样式了.IE真是个奇葩的怪胎.它的报错信息是’CSS 因 Mime 类型不匹配而被忽略‘,也就是说所有的.c ...
- unity3D 锁屏再开程序崩溃
在Uniyt3d 调用Android Plugin 的时候,会出现锁屏后再开,程序就崩溃的的现象,解决办法就是在 AndroidManifest.xml 加入 android:configChang ...
- linux之SQL语句简明教程
本教程参考http://www.1keydata.com/cn/sql/ 目的是让初学者了解linux下Mysql的操作,但是我仍想侧重于SQL语句的讲解 sql语句的学习将按照下图的流程: 当然在这 ...
- Exception in thread "main" java.io.IOException: Failed to set permissions of path
在跑BuildForest的时候,编写了下面的程序: package test.breiman; import org.apache.mahout.classifier.df.mapreduce.Bu ...
- CvMat、Mat、IplImage之间的转换详解及实例
见原博客:http://blog.sina.com.cn/s/blog_74a459380101obhm.html OpenCV学习之CvMat的用法详解及实例 CvMat是OpenCV比较基础的函数 ...