全局键盘钩子(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程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
随机推荐
- javascript 给关键字加链接
var keys = { "和尚":["http://www.baidu.com","#ff0000"], "系统":[ ...
- 复习篇(一)Activity的生命周期和启动模式
(一)关于<intent-filter>中的<data> 当设置<data>过滤器的时候,使用intent的时候必须要设置响应的匹配,否则无法匹配成功.不过不设置则 ...
- 【stm32】实现STM32的串口数据发送和printf函数重定向
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进 ...
- Delphi在Webbrowser上绘制图像
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- (Inno setup打包)检测系统是否已安装程序,若已安装则弹出卸载提示的代码
原文 http://bbs.itiankong.com/thread-30983-1-5.html 有6天没研究pascal代码了,昨天晚上突然来了灵感,终于解决了苦思冥想好几天没能解决的问题, 因此 ...
- 文艺编程 Literate Programming
(译注:这篇文章是 Donald Knuth 一篇1983年的论文:Literate Programming 的介绍部分.有人翻译为“字面编程”,是极其错误的说法,literate 根本就没有“字面” ...
- psacct监视用户执行的命令,如cpu时间和内存战胜,实时进程记账
psacct监视用户执行的命令,如cpu时间和内存战胜,实时进程记账
- C指针
1,每行最大长度,处理的最大列号; preprocessor directives,preprocessor,预处理器读入源代码,根据预处理指令对其进行修改,把修改后 的源代码递交给编译器; 预处理器 ...
- 单链表反转(递归和非递归) (Java)
链表定义 class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } 非递归实现很简单,只需要遍历一遍链表,在遍历过 ...
- 区间dp-hdu-4745-Two Rabbits
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4745 题目意思: 给n个环状的数,A.B两人沿相反的方向走,每单位时间走一步,要求相同时间两人到达相 ...