unit UnitDll;

interface

uses Windows;

const BUFFER_SIZE =  * ; // 文件映射到内存的大小
const HOOK_MEM_FILENAME = 'MEM_FILE'; // 映像文件名
const HOOK_MUTEX_NAME = 'MUTEX_NAME'; // 互斥名 type
// 共享结构
TShared = record
Keys: array[..BUFFER_SIZE] of Char;
KeyCount: Integer;
end;
// 共享结构指针
PShared = ^TShared; var
MemFile, HookMutex: THandle; // 文件句柄和互斥句柄
hOldKeyHook: HHook; // 钩子变量
Shared: PShared; // 共享变量 implementation // 重要:键盘钩子回调
function KeyHookProc(iCode: Integer; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; export;
const
KeyPressMask = $;
begin
if iCode < then
Result := CallNextHookEx(hOldKeyHook, iCode, wParam, lParam)
else
begin
if ((lParam and KeyPressMask) = ) then
begin
// 键盘消息捕获
Shared^.Keys[Shared^.KeyCount] := Char(wParam and $00FF);
Inc(Shared^.KeyCount);
// 超出内存限定大小则重置
if Shared^.KeyCount >= BUFFER_SIZE - then
Shared^.KeyCount := ;
end;
result:=;
end;
end; // 安装钩子
function EnableKeyHook: BOOL; export;
begin
Shared^.KeyCount := ;
if hOldKeyHook = then
begin
// 设置钩子过滤
{WH_KEYBOARD: 安装的是键盘钩子 KeyHookProc: 消息回调, HInstance: 回调函数实例 线程ID}
hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, HInstance, );
end;
Result := (hOldKeyHook <> );
end; {撤消钩子过滤函数}
function DisableKeyHook: BOOL; export;
begin
if hOldKeyHook <> then
begin
UnHookWindowsHookEx(hOldKeyHook);
hOldKeyHook := ;
Shared^.KeyCount := ;
end;
Result := (hOldKeyHook = );
end; // 得到获得多少按键
function GetKeyCount: Integer; export;
begin
Result := Shared^.KeyCount;
end; // 得到第I个按键
function GetKey(index: Integer): Char; export;
begin
Result := Shared^.Keys[index];
end; // 清空按键
procedure ClearKeyString; export;
begin
Shared^.KeyCount := ;
end; // 导出函数列表
exports
EnableKeyHook,
DisableKeyHook,
GetKeyCount,
ClearKeyString,
GetKey; initialization
// 创建互斥变量,DLL只能有一个进程可以使用
HookMutex := CreateMutex(nil, True, HOOK_MUTEX_NAME);
// 打开文件映像
MemFile := OpenFileMapping(FILE_MAP_WRITE, False, HOOK_MEM_FILENAME);
// 如果不存在该文件映像则创建
if MemFile = then
MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, , SizeOf(TShared), HOOK_MEM_FILENAME);
// 文件映射内存
Shared := MapViewOfFile(MemFile, File_MAP_WRITE, , , );
// 释放互斥变量
ReleaseMutex(HookMutex);
// 关闭互斥句柄
CloseHandle(HookMutex); finalization
// 撤消钩子过滤
if hOldKeyHook <> then
DisableKeyHook;
// 释放映射
UnMapViewOfFile(Shared);
// 关闭映像文件
CloseHandle(MemFile); end. unit Unit2; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls; type
TForm1 = class(TForm)
bSetHook: TButton;
Memo1: TMemo;
Panel2: TPanel;
bCancelHook: TButton;
bReadKeys: TButton;
bClearKeys: TButton; procedure bSetHookClick(Sender: TObject);
procedure bCancelHookClick(Sender: TObject);
procedure bReadKeysClick(Sender: TObject);
procedure bClearKeysClick(Sender: TObject);
end; var
Form1: TForm1; implementation {$R *.DFM}
function EnableKeyHook: BOOL; external 'KEYHOOK.DLL';
function DisableKeyHook: BOOL; external 'KEYHOOK.DLL';
function GetKeyCount: Integer; external 'KEYHOOK.DLL';
function GetKey(idx: Integer): Char; external 'KEYHOOK.DLL';
procedure ClearKeyString; external 'KEYHOOK.DLL'; procedure TForm1.bSetHookClick(Sender: TObject);
begin
EnableKeyHook;
bSetHook.Enabled := False;
bCancelHook.Enabled := True;
bReadKeys.Enabled := True;
bClearKeys.Enabled := True;
Panel2.Caption := ' 键盘钩子已经设置';
end; procedure TForm1.bCancelHookClick(Sender: TObject);
begin
DisableKeyHook;
bSetHook.Enabled := True;
bCancelHook.Enabled := False;
bReadKeys.Enabled := False;
bClearKeys.Enabled := False;
Panel2.Caption := ' 键盘钩子没有设置';
end; procedure TForm1.bReadKeysClick(Sender: TObject);
var
i: Integer;
begin
Memo1.Lines.Clear;{在Memo1中显示击键历史记录}
for i := to GetKeyCount - do
Memo1.Text := Memo1.Text + GetKey(i); end; procedure TForm1.bClearKeysClick(Sender: TObject);
begin
Memo1.Clear;
ClearKeyString;
end; end.

dll hook 共享内存数据的更多相关文章

  1. 两个exe共享内存数据

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  3. C# 进程间通信(共享内存)

    原文:C# 进程间通信(共享内存) 进程间通信的方式有很多,常用的方式有: 1.共享内存(内存映射文件,共享内存DLL). 2.命名管道和匿名管道. 3.发送消息 本文是记录共享内存的方式进行进程间通 ...

  4. Windows进程间通讯(IPC)----共享内存

    Windows中同一个EXE文件多次加载过程 Windows中EXE文件加载是基于内存映射文件的. 当EXE文件第一次被加载. 首先系统会先创建一个进程内核对象,并创建一个新的进程地址空间. 系统调用 ...

  5. (原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF

    一.前言 进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道.Socket.消息.本地文件.共享内存等,每种方式都有各自适应的场景. 在进行大数据交换时,最优的方式便是共享内存. ...

  6. System V IPC(3)-共享内存

    一.概述                                                    1.共享内存允许多个进程共享物理内存的同一块内存区. 2.与管道和消息队列不同,共享内存 ...

  7. Windows共享内存示例

    共享内存主要是通过映射机制实现的. Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的.所谓的重叠是指同一块内存区域可能被多个进程同时使用.当调用 CreateFileMapp ...

  8. Linux下用信号量实现对共享内存的访问保护

    转自:http://www.cppblog.com/zjl-1026-2001/archive/2010/03/03/108768.html 最近一直在研究多进程间通过共享内存来实现通信的事情,以便高 ...

  9. 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏

    一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...

随机推荐

  1. js封装、继承

    封装:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html 继承:http://ww ...

  2. 剑指offer自学系列(一)

    题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...

  3. R 读取excel的方法

    1.加载 readxl 包,利用 reade_excel() 函数 install.packages("readxl") library(readxl) data = read_e ...

  4. 111-PHP类变量之间的赋值标识为同一个对象

    <?php class mao{ //定义猫类 public $age=0; //定义多个属性并初始化 public $weight=50; public $color='white'; } $ ...

  5. Essay写作的五大陷阱如何避免?

    相信ESSAY写作对留学生来说印象非常深刻,由于国外不同的教育模式,老师动不动就是一篇essay.可是在大家都拥有相同的GMAT或者GPA以及雅思分数的情况下.大家如何才能够脱颖而出呢?下面BayDu ...

  6. AI 人工智能产业园路口-----dp

    北京市商汤科技开发有限公司建立了新的 AI 人工智能产业园,这个产业园区里有 nn 个路口,由 n - 1n−1 条道路连通.第 ii 条道路连接路口 u_iui​ 和 v_ivi​. 每个路口都布有 ...

  7. linux 命令之 objdump 简单使用

    objdump 介绍 objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具 objdump 选项介绍 --archive-headers -a 显示档案库的成员信息,类似ls -l ...

  8. 自定义 radio 的样式,更改选中样式

      思路: 1. 可以为<label>元素添加生成性内容(伪元素),并基于单选按钮的状态来为其设置样式: 2. 然后把真正的单选按钮隐藏起来: 3. 最后把生成内容美化一下. 解决方法: ...

  9. easyUI中,z-index失效问题

    1.z-index是css的属性,第一种div设置css的z-index时,是不起作用的,最后设置在style中才起作用了,比较诡异的一件事情. 2.还有一种情况就是,遮盖层在dialog弹出层的下面 ...

  10. Pillow库的学习和使用

    1.encoder jpeg not available sudo apt-get install libjpeg-dev pip install -I pillow