Delphi HOOK示例
本应用程序的Hook:
unit UFrmMain; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TForm1 = class(TForm)
btnClose: TButton;
btnSetHook: TButton;
btnSizeLongInt: TButton;
procedure btnCloseClick(Sender: TObject);
procedure btnSetHookClick(Sender: TObject);
procedure btnSizeLongIntClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm}
var
hHookKeyboard : HHOOK; procedure TForm1.btnCloseClick(Sender: TObject);
begin
close;
end; function MouseHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
result := 1;
end; function KeyHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
if (wparam = vk_f4) and ((lparam and (1 shl 29)) > 0) then
result := 1
else
result := CallNextHookEx(hHookKeyboard, code, wparam, lparam);
end; procedure TForm1.btnSetHookClick(Sender: TObject);
begin
SetWindowsHookEx(WH_MOUSE,@MouseHook,HInstance,GetCurrentThreadId());
hHookKeyboard := SetWindowsHookEx(WH_KEYBOARD,@KeyHook,HInstance,GetCurrentThreadId());
end; procedure TForm1.btnSizeLongIntClick(Sender: TObject);
begin
ShowMessageFmt('sizeof longint:%d',[sizeof(longint)]);
end; end.
//HookLibInterface.pas
unit HookLibInterface; interface
USES
windows;
{$IFNDEF HookLibInterface}
procedure SetHook(hwnd1:HWND); stdcall;
procedure UnHook(); stdcall;
{$ENDIF} implementation
{$IFNDEF HookLibInterface}
procedure SetHook(hwnd1:HWND); external 'HookLib.dll' name 'SetHook';
procedure UnHook(); external 'HookLib.dll' name 'UnHook';
{$ENDIF} end.
//HookLib.dpr
library HookLib; { 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,
Classes,
Windows,
Messages,
Dialogs,
HookLibInterface in 'HookLibInterface.pas'; {$R *.res}
var
hMouseHook : HHOOK;
hKeyboardHook : HHOOK;
var
g_hwnd : HWND; function MouseHookProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
result := 1;
end;
function KeyboardHookProc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
if vk_f2 = wparam then
begin
PostMessage(g_hwnd,wm_close,0,0);
//UnhookWindowsHookEx(hMouseHook);
UnhookWindowsHookEx(hKeyboardHook);
end;
result := 1;
end; procedure SetHook(hwnd1 : HWND); stdcall;
begin
g_hwnd := hwnd1;
//hMouseHook := SetWindowsHookEx(WH_MOUSE, MouseHookProc, GetModuleHandle('HookLib.dll'),0);
hKeyboardHook := SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, GetModuleHandle('HookLib.dll'),0);
showmessage('成功加载勾子程序!');
end; procedure UnHook(); stdcall;
begin
//UnhookWindowsHookEx(hMouseHook);
UnhookWindowsHookEx(hKeyboardHook);
showmessage('成功取消勾子程序!');
end;
exports
SetHook,
Unhook;
end.
使用:
unit UMain; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TFrmMain = class(TForm)
btnClose: TButton;
btnHookMouse: TButton;
btnUnHookMouse: TButton;
procedure btnCloseClick(Sender: TObject);
procedure btnHookMouseClick(Sender: TObject);
procedure btnUnHookMouseClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
FrmMain: TFrmMain; implementation
uses
HookLibInterface;
{$R *.dfm} procedure TFrmMain.btnCloseClick(Sender: TObject);
begin
close;
end; procedure TFrmMain.btnHookMouseClick(Sender: TObject);
begin
SetHook(application.Handle);
end; procedure TFrmMain.btnUnHookMouseClick(Sender: TObject);
begin
UnHook;
end; procedure TFrmMain.FormCreate(Sender: TObject);
begin
SetWindowPos(self.Handle,HWND_TOPMOST,0,0,screen.Width,Screen.Height,SWP_SHOWWINDOW );
end; end.
HookLib.dll共享内存最终版:
//HookLib.dpr
library HookLib; { 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,
Classes,
Windows,
Messages,
Dialogs,
HookLibInterface in 'HookLibInterface.pas'; {$R *.res}
const
cMMFileName: PChar = 'SharedMapData';
var
hMouseHook : HHOOK;
hKeyboardHook : HHOOK; type
TGlobalDLLData = HWND;
PGlobalDLLData = ^HWND;
var
GlobalData : PGlobalDLLData;
MapHandle : THandle;
{
var
g_hwnd : HWND;
}
function MouseHookProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
result := 1;
end;
function KeyboardHookProc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
if vk_f2 = wparam then
begin
messagebeep(0);
PostMessage(GlobalData^,wm_close,0,0);
//UnhookWindowsHookEx(hMouseHook);
UnhookWindowsHookEx(hKeyboardHook);
end;
result := 1;
end; procedure SetHook(aHwnd : HWND); stdcall;
begin
//g_hwnd := aHwnd;
GlobalData^ := aHwnd;
//hMouseHook := SetWindowsHookEx(WH_MOUSE, MouseHookProc, GetModuleHandle('HookLib.dll'),0);
hKeyboardHook := SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, GetModuleHandle('HookLib.dll'),0);
showmessage('成功加载勾子程序!');
end; procedure UnHook(); stdcall;
begin
//UnhookWindowsHookEx(hMouseHook);
UnhookWindowsHookEx(hKeyboardHook);
showmessage('成功取消勾子程序!');
end;
exports
SetHook,
Unhook; procedure OpenSharedData;
var
Size: Integer;
begin
{ Get the size of the data to be mapped. }
Size := SizeOf(TGlobalDLLData); { Now get a memory-mapped file object. Note the first parameter passes
the value $FFFFFFFF or DWord(-1) so that space is allocated from the system's
paging file. This requires that a name for the memory-mapped
object get passed as the last parameter. } MapHandle := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, Size, cMMFileName); if MapHandle = 0 then
RaiseLastWin32Error;
{ Now map the data to the calling process's address space and get a
pointer to the beginning of this address }
GlobalData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size); if GlobalData = nil then
begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end;
end; procedure CloseSharedData;
{ This procedure un-maps the memory-mapped file and releases the memory-mapped
file handle }
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MapHandle);
end; procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenSharedData;
DLL_PROCESS_DETACH: CloseSharedData;
end;
end;
begin
{ First, assign the procedure to the DLLProc variable }
DllProc := @DLLEntryPoint;
{ Now invoke the procedure to reflect that the DLL is attaching
to the process }
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Delphi HOOK示例的更多相关文章
- React教程:4 个 useState Hook 示例
摘要: React示例教程. 原文:快速了解 React Hooks 原理 译者:前端小智 到 React 16.8 目前为止,如果编写函数组件,然后遇到需要添加状态的情况,咱们就必须将组件转换为类组 ...
- windows钩子 Hook示例
1.首先编写一个 win32 dll工程. #include "stdafx.h" int WINAPI add(int a,int b) { return a+b; } BOOL ...
- Delphi Dll示例
//MyInt.pas unit MyInt; interface {$IFNDEF MYLIB} function MyAdd(a,b:integer):integer ;stdcall; {$EN ...
- delphi hook alt+F4 ctrl+delete+alt win键等
unit uHook; interface uses Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, Dialogs ...
- delphi WaitForSingleObject 示例之一等待另一个进程的结束
<pre>unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Cont ...
- Hook入门
Hook入门 2014-07-24 基本概念 Windows消息机制 Hook(钩子) 运行机制 核心函数 C# hook示例 基本概念[1] Windows消息机制[5] Windows操作系统是建 ...
- helm-chart7,调试与hook
调试 几个命令可以帮助进行调试 helm lint 首选工具,返回错误和警告信息. helm install --dry-run --debug:服务器会渲染你的模板,然后返回结果清单文件. helm ...
- react新特性hook
一.hook示例. import React, { useState } from 'react'; function Example() { // 声明一个叫 “count” 的 state 变 ...
- PHP API 框架开发的学习
基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用.对外提供的API 调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户.开发者和中小网站带来了更大的 ...
随机推荐
- 编程中、遇到问题、bug多思考
偶然间看到一篇很好的文章,关于编程过程中的思考. http://www.cnblogs.com/dongqingswt/archive/2012/12/26/2834675.html#3457256 ...
- DataTable排序的一般方法
一.重生法dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc" 二.直接法dv = New Da ...
- Complete the Sequence[HDU1121]
Complete the Sequence Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- BZOJ3413 : 匹配
FDUSC前刷刷题吧.. 本题每个询问就是说将询问串与主串每个后缀匹配,若匹配成功则结束,否则加上lcp的长度 对主串建立后缀树,并用主席树维护DFS序 对于每个询问串,找到最后走到的点fin_nod ...
- 【wikioi】1012 最大公约数和最小公倍数问题
题目链接 算法:辗转相除(欧几里得) gcd(a, b)是a和b最小公倍数, lcm(a, b)是a和b的最大公倍数 gcd(a, b) == gcd(b, a%b) 时间复杂度: O(lgb) 具体 ...
- 【Vijos】1218 数字游戏
题目链接:https://vijos.org/p/1218 算法:环形DP+划分型DP 环形DP的思路很简单,将1~n中每一个节点当成起点进行划分型DP即可,关于划分型DP前面论文有介绍~查找tag把 ...
- HDU 4614 Vases and Flowers(线段树+二分)
题目链接 比赛的时候一直想用树状数组,但是树状数组区间更新之后,功能有局限性.线段树中的lz标记很强大,这个题的题意也挺纠结的. k = 1时,从a开始,插b个花,输出第一个插的位置,最后一个的位置, ...
- MySQL修改root密码的各种方法整理
方法一: 1.首先cmd中输入 net stop mysql //停止Mysql服务 2.然后在my.ini文件中的[mysqld]下面一行添加 skip_grant_tables 3.在cmd ...
- 验证标题是否存在(TextBox控件失去焦点验证)
首先解释两个属性, AutoPostBack 属性用于设置或返回当用户在 TextBox 控件中按 Enter 或 Tab 键时,是否发生自动回传到服务器的操作. 如果把该属性设置为 TRUE,则启用 ...
- Toll-Free Bridge
引 在深入了解桥接机制的时候看到一篇好文,虽然已经很久远,但是忍不住看了好几遍,心中诸多不解一扫而光.在此放上链接: 原文:http://ridiculousfish.com/blog/posts/b ...