本人在写一个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.

解决方案 »

  1.   

    如上的代码可以捕获记事本(notepad)字母(有重复),但是无法显示出来,还抛出异常了呢!!
      

  2.   

    我没明白你的意思。捕获记事本的内容。为什么要用钩子呢你直接枚举进程,看有没有记事本进程,然后FindWindowEx就可以知道记事本里面的内容了啊。 
      

  3.   

    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;
    明显重复了.关闭窗口,会触发CLOSE,也会DESTROY:如果是退出了程序.