全局键盘钩子(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程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
随机推荐
- windows 文件watch nodejs
本篇博客,主要是记录下最近一直纠结的gulp.watch方法,在工作中我们肯定都遇到过,新添加的文件没办法自动触发watch,下面我们就来看有什么办法处理 1.首先我们肯定是先百度一下 百度推荐的是g ...
- [汇编语言]-第八章 div指令,伪指令dd,dup
1- div除法指令 (1) 除数: 有8位和16位两种,在一个寄存器或内存单元中. (2) 被除数: 默认放在AX和DX或AX中 除数为8位, 被除数为16位, 默认在AX中存放. 除数为16位, ...
- Ubuntu配置OpenGL环境
建立基本编译环境 sudo apt-get install build-essential 安装OpenGL Library sudo apt-get install libgl1-mesa-dev ...
- fzu 1753 Another Easy Problem
本题题意为求 t (t<150) 个 c (n,m) (1<=m<=n<=100000)的最大公因子: 本题的难点为优化.主要有两个优化重点.一是每次对单个素因子进行处理,优 ...
- GO的GDB调试
GoLang语言,学了很久,一直觉得它单步调试有较多问题,最近才知道自已对它了解得太少了.原来GO语言对GDB的版本是至少为gdb7以上,才能比较好的打印任意变量,如果低于这个版本,则才会出一些问题. ...
- 走出MFC子类化的迷宫
走出MFC子类化的迷宫 KEY WORDS:子类化 SUBCLASSWINDOW MFC消息机制 许多Windows程序员都是跳过SDK直接进行RAD开发工具[或VC,我想VC应不属于RAD]的学习 ...
- Embedded software develop step
x86 –>embeded so you you must familiar with x86 first-
- Android 获取系统内置Intent
1,掉web浏览器 Uri myBlogUri = Uri.parse("http://www.yzmanga.com"); returnIt = new Intent(Inten ...
- [Leetcode][Python]44:Wildcard Matching
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 44:Wildcard Matchinghttps://oj.leetcode ...
- linux之SQL语句简明教程---GROUP BY
我们现在回到函数上.记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (Store_Name) 的营业额 (Sales),那怎么办呢?在这个情况下 ...