为了显示效果,在钩子的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 = then
CallHandle := FindWindow(nil,'TestMain');
//获取按键状态 小于0表示按下,如果不做判断,按键按下或抬起都会执行SendMessage
//下面发送WM_USER+101消息,此消息可以用自定义的消息标识发送
if GetKeyState(wParam) < then
SendMessage(CallHandle,WM_USER+,wParam,processid);
end
else
//下一个钩子
Result := CallNextHookEx(fHook,code,wParam,lParam);
end; procedure SetHook;stdcall;
begin
//挂钩,这里没有做挂钩失败的提示
fHook := SetWindowsHookEx(WH_KEYBOARD,@HookProc,HInstance,);
end; procedure StopHook;stdcall;
begin
//摘钩
if fHook <> then
UnhookWindowsHookEx(fHook);
end; exports
SetHook name 'SetHook',
StopHook name 'StopHook'; begin
//初始CallHandle为0
CallHandle := ;
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+ then
begin
//创建进程快照
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
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.

[转载] 全局键盘钩子(WH_KEYBOARD)的更多相关文章

  1. 全局键盘钩子(WH_KEYBOARD)

    为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...

  2. 使用raw input 代替全局键盘钩子

    //关于raw input 请查看msdn https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536%28v=vs.85%29 ...

  3. c#-全局键盘钩子

    using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using ...

  4. 【VB6】全局键盘钩子

    基本也没啥好说的,不要用到木马及恶意程序中是以前从VB.NET程序改到VB6的,阉割了一些功能,只提供键盘Hook功能想要截获热键可以在处理函数中返回1,里面有示例 下载地址 http://pan.b ...

  5. C#简单鼠标键盘钩子KMHook

    简介:由三个文件构成Pinvo.cs.KeyboardHook.cs.MouseHook.cs Pinvo.cs 是KeyboardHook与MouseHook需要的一些常量消息的定义 Keyboar ...

  6. 2.添加键盘钩子。向进程中注入dll

    学习笔记 1.首先要建立mfc的动态链接库.在def文件中放入要导出的函数名. 2.添加函数如下 //安装钩子 //HHOOK SetWindowsHookEx( // int idHook,//钩子 ...

  7. C#实现键盘钩子

    前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...

  8. C#鼠标键盘钩子

    using System;using System.Collections.Generic; using System.Reflection; using System.Runtime.Interop ...

  9. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

随机推荐

  1. HBase源码系列之HFile

    本文讨论0.98版本的hbase里v2版本.其实对于HFile能有一个大体的较深入理解是在我去查看"到底是不是一条记录不能垮block"的时候突然意识到的. 首先说一个对HFile ...

  2. PHP的ArrayAccess接口介绍

    在 PHP5 中多了一系列新接口.在 HaoHappy 翻译的你可以了解到他们的应用.同时这些接口和一些实现的 Class 被归为 Standard PHP Library(SPL).在 PHP5 中 ...

  3. 30s源码刨析系列之函数篇

    前言 由浅入深.逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美. 本系列是对名库 30SecondsOfCode 的深入刨析. 本篇是其中的函数篇,可以在极短的时间 ...

  4. Typora+PicGo+Gitee笔记方案

    前言:需要学习的知识太多,从一开始就在寻找一款能让我完全满意的编辑器,然而一直都没有令我满意的.在前两天Typora新版本更新后,总算是拥有了一套我认为很完美的笔记方案:使用Typora编写markd ...

  5. 安装Kubernetes集群时遇到的问题及解决方法

    在搭建Kubernetes集群时遇到一些问题,记录在这里. 搭建过程在另一篇文章:VirtualBox上使用kubeadm安装Kubernetes集群 1. 虚拟机安装完CentOS7登录时遇到war ...

  6. direction和writing-mode的介绍

    direction介绍 属性值和兼容都很好 CSSdirection属性简单好记,属性值少,兼容性好,关键时候省心省力,是时候给大家宣传宣传,不要埋没了人家的特殊技能. Chrome Safari F ...

  7. 《高性能javascript》阅读摘要

    最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践.性能优化类的书.记录下主要知识. 加载和执行 脚本位置 放在<head>中的javasc ...

  8. js移动端滑倒顶部加载历史消息解决方案!

    最近做了一个语音直播聊天的项目,有一个功能是当没有直播时,进入房间可以查看历史消息,滑动到顶部加载之前的历史消息,我用jquery scroll事件,来判断是否滚动到顶部,问题来了: 首先触发请求事件 ...

  9. VUE实现Studio管理后台(九):开关(Switch)控件,输入框input系列

    接下来几篇作文,会介绍用到的输入框系列,今天会介绍组普通的调用方式,因为RXEditor要求复杂的输入功能,后面的例子会用VUE的component动态调用,就没有今天的这么直观了,控件的实现原理都一 ...

  10. spring——AOP原理及源码(五)

    前情回顾: 在上一篇中,通过 wrapIfNecessary 方法,我们获取到了合适的增强器(日志方法)与业务类进行包装,最终返回了我们业务类的代理对象. 本篇我们将从业务方法的执行开始,看看增强器( ...