调用dll的unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function HookOn(lpHwnd:HWND;lpType:Longint):Longint;stdcall;external 'Hook32.dll' name 'HookOn';
function HookOff:Boolean;stdcall;external 'Hook32.dll' name 'HookOff';
implementation
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
hookoff;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
h1:HWND;
begin
h1:=FindWindow(NIL,'无标题 - 记事本');//这是窗口的句柄,要自己找到后,填写入。
if h1=0 then showmessage('没找到进程!');
if h1>0 then showmessage('找到进程!');
sleep(2000);
HookOn(h1,WH_KEYBOARD);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
HookOff;
end;
end.
-------------------------------------------------------------------------------------------------------
dll源码library Hook32;
uses
SysUtils,
Forms,
Classes,
myDLl in 'myDLl.pas' {Form1};
{$R *.res}
exports
HookOn,HookOff;
begin
{Application.Initialize;
Application.Run; }
end.
unit myDLl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;
function HookOn(lpHwnd:HWND;lpType:Longint):Longint;stdcall;export;
function HookOff:Boolean;stdcall;export;
implementation
var
hHk: HHOOK=0;
mhwnd:HWND=0;
bShow:Integer=1;
hThread: Cardinal;
hmod: Pointer; //Hinstance
hProcessId: Cardinal;
mMode:Integer;
{$R *.dfm}
function HookProc(nCode:Integer;WParam: WPARAM;LParam:LPARAM):LRESULT;stdcall;
begin
if (bShow=1) And (wParam=VK_F8) then
begin
bShow:=5;
Form1:=TForm1.Create(Application);
Form1.Show;
ShowCursor(true);
end;
if (bShow=2) And (wParam=VK_F8) then
begin
bShow:=6;
Form1.Free;
end;
if (bShow=3) And (wParam=VK_F8) then
begin
bShow:=2;
end;
if (bShow=4) And (wParam=VK_F8) then
begin
bShow:=1;
end;
if (bShow=5) then bShow:=3;
if (bShow=6) then bShow:=4;
Result := CallNextHookEx(hHk,nCode,WParam,LParam);
end;
function HookOn(lpHwnd:HWND;lpType:Longint): Longint;stdcall; export;
begin
hThread :=GetWindowThreadProcessId(lpHwnd,hmod);
if lpHwnd<>0 then hHk :=SetWindowsHookEx(lpType,@HookProc,hInstance,hThread);
Result :=hHk
end;
function HookOff:Boolean;stdcall; export;
begin
if hHk<>0 then
begin
UnHookWindowsHookEx(hHk);
hHk :=0;
Result :=true;
end
else
Result :=false;
end;
end.
|