为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找。
KeyBoardHook.dll代码
- library KeyBoardHook;
-
-
- uses
- SysUtils,Windows,Messages,
- Classes;
-
- var
- fHook:HHOOK;
-
- CallHandle:HWND;
-
- {$R *.res}
-
- function HookProc(code:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
- var
- processid:Cardinal;
- begin
-
- if code = HC_Action then
- begin
-
- processid := GetCurrentProcessId;
-
- if CallHandle = 0 then
- CallHandle := FindWindow(nil,‘TestMain‘);
-
-
- if GetKeyState(wParam) < 0 then
- SendMessage(CallHandle,WM_USER+101,wParam,processid);
- end
- else
-
- Result := CallNextHookEx(fHook,code,wParam,lParam);
- end;
-
- procedure SetHook;stdcall;
- begin
-
- fHook := SetWindowsHookEx(WH_KEYBOARD,@HookProc,HInstance,0);
- end;
-
- procedure StopHook;stdcall;
- begin
-
- if fHook <> 0 then
- UnhookWindowsHookEx(fHook);
- end;
-
- exports
- SetHook name ‘SetHook‘,
- StopHook name ‘StopHook‘;
-
- begin
-
- CallHandle := 0;
- end.
TestKeyBoardHook主程序代码
- unit TestMain;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls,TlHelp32;
-
- type
- TfrmTestMain = class(TForm)
- Memo1: TMemo;
- btn_SetHook: TButton;
- btn_StopHook: TButton;
- procedure btn_SetHookClick(Sender: TObject);
- procedure btn_StopHookClick(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- private
-
- procedure WndProc(var Message: TMessage);override;
- public
-
- end;
-
- var
- frmTestMain: TfrmTestMain;
-
- implementation
-
- procedure SetHook;stdcall;external ‘KeyBoardHook‘;
- procedure StopHook;stdcall;external ‘KeyBoardHook‘;
-
- {$R *.dfm}
-
- procedure TfrmTestMain.btn_SetHookClick(Sender: TObject);
- begin
- SetHook;
- end;
-
- procedure TfrmTestMain.btn_StopHookClick(Sender: TObject);
- begin
- StopHook;
- end;
-
- procedure TfrmTestMain.WndProc(var Message: TMessage);
- var
- hSnapShot:THandle;
- pEntry:TProcessEntry32;
- find:Boolean;
- proName:string;
- begin
- if Message.Msg = WM_USER+101 then
- begin
-
- hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- pEntry.dwSize := SizeOf(pEntry);
- find := Process32First(hSnapShot,pEntry);
- while find do
- begin
-
- proName := pEntry.szExeFile;
- if pEntry.th32ProcessID = Message.LParam then Break;
- find := Process32Next(hSnapShot,pEntry);
- end;
- Memo1.Lines.Add(‘进程:‘ + proName + ‘,ID:‘ +IntToStr(Message.LParam)+‘按下按键:‘+Chr(Message.WParam));
- CloseHandle(hSnapShot);
- end;
- inherited;
- end;
-
- procedure TfrmTestMain.FormClose(Sender: TObject;
- var Action: TCloseAction);
- begin
- StopHook;
- end;
-
- end.
运行结果

http://blog.csdn.net/bdmh/article/details/6124127
全局键盘钩子(WH_KEYBOARD)
原文:http://www.cnblogs.com/findumars/p/5001978.html