本应用程序的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示例的更多相关文章

  1. React教程:4 个 useState Hook 示例

    摘要: React示例教程. 原文:快速了解 React Hooks 原理 译者:前端小智 到 React 16.8 目前为止,如果编写函数组件,然后遇到需要添加状态的情况,咱们就必须将组件转换为类组 ...

  2. windows钩子 Hook示例

    1.首先编写一个 win32 dll工程. #include "stdafx.h" int WINAPI add(int a,int b) { return a+b; } BOOL ...

  3. Delphi Dll示例

    //MyInt.pas unit MyInt; interface {$IFNDEF MYLIB} function MyAdd(a,b:integer):integer ;stdcall; {$EN ...

  4. delphi hook alt+F4 ctrl+delete+alt win键等

    unit uHook; interface uses  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, Dialogs ...

  5. delphi WaitForSingleObject 示例之一等待另一个进程的结束

    <pre>unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Cont ...

  6. Hook入门

    Hook入门 2014-07-24 基本概念 Windows消息机制 Hook(钩子) 运行机制 核心函数 C# hook示例 基本概念[1] Windows消息机制[5] Windows操作系统是建 ...

  7. helm-chart7,调试与hook

    调试 几个命令可以帮助进行调试 helm lint 首选工具,返回错误和警告信息. helm install --dry-run --debug:服务器会渲染你的模板,然后返回结果清单文件. helm ...

  8. react新特性hook

    一.hook示例.   import React, { useState } from 'react'; function Example() { // 声明一个叫 “count” 的 state 变 ...

  9. PHP API 框架开发的学习

    基于互联网的应用正变得越来越普及,在这个过程中,有更多的站点将自身的资源开放给开发者来调用.对外提供的API 调用使得站点之间的内容关联性更强,同时这些开放的平台也为用户.开发者和中小网站带来了更大的 ...

随机推荐

  1. DelPhi连接数据库方式

    一.SQL Server 2000 的连接数据库 1.无密码连接SQLL:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;In ...

  2. BZOJ1099 : [POI2007]树Drz

    首先1与i交换,n与i交换,i与i+1交换的可以$O(n)$算出. 然后只需要考虑i与x交换(1<i,x<n且|i-x|>1). 设 a[i]=h[i-1] b[i]=h[i+1] ...

  3. BZOJ3881 : [Coci2015]Divljak

    对Alice的所有串构造AC自动机,并建出Fail树 每当Bob添加一个串时,在AC自动机上走,每走到一个点,就把它到根路径上所有点的答案+1 需要注意的是每次操作,相同的点只能被加一次 所以在需要操 ...

  4. HDU 4003 (树形DP+背包)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...

  5. 【wikioi】1229 数字游戏(dfs+水题)

    http://wikioi.com/problem/1229/ 赤裸裸的水题啊. 一开始我认为不用用完全部的牌,以为爆搜会tle.. 可是我想多了. 将所有状态全部求出,排序后暴力判断即可. (水题有 ...

  6. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

  7. C#中使用JQueryUI中Autocomplete插件

    服务器端后台代码: 1 private string GetModelNames() { 2 return @"[ 3 { 4 'value': 'jquery', 5 'label': ' ...

  8. Linux环境下实现哲学家就餐问题

    #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <pthread.h& ...

  9. 关于javascript在作用域中的变量定义你所不知道的一些东西

    //先看一段代码 var a = 100; function test(){ alert(a); var a = 200; } test(); /* 结果:undifined 原因:js引擎在执行sc ...

  10. post可以直接把get请求代入到目标url中

    Feigong --非攻 非攻 取自<秦时明月>--非攻,针对不同情况自由变化的武器 Feigong,针对各种情况自由变化的mysql注入脚本 Feigong,In view of the ...