本人在写一个dll动态链接库。
这是一个钩子函数,只要用于捕获记事本(notepad)的内容,然后返回给调用dll的应用程序。
以下是程序代码:
dll的代码: library Project1;
uses
SysUtils,
Classes,
Unit1 in 'Unit1.pas';{$R *.res}
exports startHook,stopHook,getCurrentInputInfo;begin
end.
unit Unit1;interfaceuses ShareMem,messages,SysUtils,dialogs,windows;var
keyHook: HHook;
str: String;
function keyHookProc(nCode: integer;wparam: WPARAM;lparam: LPARAM): LResult;stdcall;
function startHook():bool; stdcall;
function stopHook():bool; stdcall;
function getCurrentInputInfo():String;stdcall;
implementation function keyHookProc(nCode: integer;wparam: WPARAM;lparam: LPARAM): LResult;stdcall;
begin
if nCode < 0 then
result := callNextHookEx(keyHook,nCode,wparam,lparam); str := str + chr(wparam);
showmessage(str);
end; function startHook():bool; stdcall;
var
l,dwThreadId: integer;
begin
l := FindWindow('Notepad',nil);
dwThreadId := GetWindowThreadProcessId(l,nil);
showmessage(inttostr(dwThreadId));
keyHook := setWindowsHookEx(WH_KEYBOARD,@keyHookProc,hInstance,dwThreadId);
//keyHook := setWindowsHookEx(WH_KEYBOARD,@keyHookProc,0,getCurrentThreadID);
result := true;
end; function stopHook(): bool;stdcall;
begin
unHookWindowsHookEx(keyHook);
result := true;
end; function getCurrentInputInfo():String;stdcall;
begin
result := str;
end;
end.
主应用程序代码:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}function startHook():BOOL; stdcall; external 'Project1.dll';
function stopHook():BOOL; stdcall; external 'Project1.dll';
function getCurrentInputInfo():String;stdcall; external 'Project1.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
startHook();
showmessage('钩子成功卸载');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.Button3Click(Sender: TObject);
begin
memo1.Lines.Text := getCurrentInputInfo();
end;procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Lines.Clear;
end;end.
这是一个钩子函数,只要用于捕获记事本(notepad)的内容,然后返回给调用dll的应用程序。
以下是程序代码:
dll的代码: library Project1;
uses
SysUtils,
Classes,
Unit1 in 'Unit1.pas';{$R *.res}
exports startHook,stopHook,getCurrentInputInfo;begin
end.
unit Unit1;interfaceuses ShareMem,messages,SysUtils,dialogs,windows;var
keyHook: HHook;
str: String;
function keyHookProc(nCode: integer;wparam: WPARAM;lparam: LPARAM): LResult;stdcall;
function startHook():bool; stdcall;
function stopHook():bool; stdcall;
function getCurrentInputInfo():String;stdcall;
implementation function keyHookProc(nCode: integer;wparam: WPARAM;lparam: LPARAM): LResult;stdcall;
begin
if nCode < 0 then
result := callNextHookEx(keyHook,nCode,wparam,lparam); str := str + chr(wparam);
showmessage(str);
end; function startHook():bool; stdcall;
var
l,dwThreadId: integer;
begin
l := FindWindow('Notepad',nil);
dwThreadId := GetWindowThreadProcessId(l,nil);
showmessage(inttostr(dwThreadId));
keyHook := setWindowsHookEx(WH_KEYBOARD,@keyHookProc,hInstance,dwThreadId);
//keyHook := setWindowsHookEx(WH_KEYBOARD,@keyHookProc,0,getCurrentThreadID);
result := true;
end; function stopHook(): bool;stdcall;
begin
unHookWindowsHookEx(keyHook);
result := true;
end; function getCurrentInputInfo():String;stdcall;
begin
result := str;
end;
end.
主应用程序代码:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}function startHook():BOOL; stdcall; external 'Project1.dll';
function stopHook():BOOL; stdcall; external 'Project1.dll';
function getCurrentInputInfo():String;stdcall; external 'Project1.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
startHook();
showmessage('钩子成功卸载');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.Button3Click(Sender: TObject);
begin
memo1.Lines.Text := getCurrentInputInfo();
end;procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Lines.Clear;
end;end.
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
stopHook();
showmessage('钩子成功卸载');
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
stopHook();
showmessage('钩子成功卸载');
end;
明显重复了.关闭窗口,会触发CLOSE,也会DESTROY:如果是退出了程序.