Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Хук на клавиатуру и мышь   Найти похожие ветки 

 
juiceman ©   (2004-04-05 08:32) [0]

Ставлю глобальный хук на клавиатуру...
Библиотека:

library hook_dll1;

uses
 Windows,
 Messages,
 Forms;

var
 H : THandle;
 MouseHook: HWND; // дескриптор установленной ловушки

{Данная ф-ия вызывается системой каждый раз, когда возникает какое-то событие в
dialog box-е, message box-е, menu, или scroll bar-е}
function MouseProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code >= 0 then
 begin
 {Проверяю, нажата ли правая кнопка мыши}
     {Вывожу сообщение при удачной работе.}
 //if wParam= then
   SendMessage(FindWindow("TForm1","Form1"),WM_CHAR,wparam,0);
 end;
 {Пытаемся передать сообщение дальше по цепочке hook-ов. }
 Result:= CallNextHookEx(H, Code, wParam, lParam);
end;

{Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
 if switch=true then
 begin
   {Устанавливаю HOOK, если он не установлен (switch=true). }
   H := SetWindowsHookEx(WH_KEYBOARD, @MouseProc, HInstance, 0);
   if H <> 0 then
       MessageBox(0, "Mouse HOOK установлен !", "Message from Exampel2/Process1", 0)
     else
       MessageBox(0, "Mouse HOOK установить не удалось !", "Message from Exampel2/Process1", 0);
 end
 else
 begin
   {Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
   if UnhookWindowsHookEx(H) then
     MessageBox(0, "Mouse HOOK снят !", "Message from Exampel2/Process1", 0)
   else
     MessageBox(0, "Mouse HOOK снять не удалось !", "Message from Exampel2/Process1", 0);

 end;
end;

exports hook;

begin
end.


Сама программа:

...
TForm1 = class(TForm)
   Button1: TButton;
   Timer1: TTimer;
   Memo1: TMemo;
   Button2: TButton;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
   procedure HOOKEVENT(var Msg:TWMCHAR);message WM_CHAR;
 public
   { Public declarations }
 end;

 MyProcType = procedure (flag : Boolean); stdcall;

var
 Form1: TForm1;
 Hdll : HWND; { дескриптор загружаемой DLL (для динамической загрукзки)}
...
procedure TForm1.Button2Click(Sender: TObject);
var
 hook: MyProcType;
begin

 @hook:= nil; // инициализируем переменную hook

{ ********* динамическая загрузка **************}

 Hdll:= LoadLibrary(PChar("hook_dll1.dll")); { загрузка DLL }
 if Hdll > HINSTANCE_ERROR then            { если всё без ошибок, то }
   begin
     @hook:=GetProcAddress(Hdll, "hook");     { получаем указатель на необходимую процедуру}
     Button2.Enabled:=True;
     Button1.Enabled:=False;
     hook(true);
   end
 else
   ShowMessage("Ошибка при загрузке DLL !");

{ **********************************************}
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 hook: MyProcType;
begin
 @hook:= nil; // инициализируем переменную hook
 if Hdll > HINSTANCE_ERROR then
   begin                                   { если всё без ошибок, то }
     @hook:=GetProcAddress(Hdll, "hook");  { получаем указатель на необходимую процедуру}
     Button1.Enabled:=True;
     Button2.Enabled:=False;
     hook(false);                           {вызываем нужную процедуру из DLL}
   end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 FreeLibrary(Hdll); { при закрытии формы - освобождаем DLL }
end;

procedure TForm1.HOOKEVENT(var Msg:TWMKEY);
begin
Memo1.Lines.Add(chr(Msg.CharCode));
if Msg.CharCode=13 then showmessage("enter!");
Msg.Result:=0;
end;

end.

Все вроде нормально работает, только клавиша "двоится" - нажимаю раз, показывает как за два. ??????


 
rimd ©   (2004-04-05 12:00) [1]

все дело в том что этот хук ловит up и down, т.е. когда ты нажимаешь кнопку срабатывает ф-ция, а когда отпускаешь то тоже срабатывает.


 
juiceman ©   (2004-04-07 09:41) [2]

спасибо



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.09 c
4-1081328122
juiceman
2004-04-07 12:55
2004.05.23
Чужой TLISTVIEW


14-1083578926
тихий вовочка
2004-05-03 14:08
2004.05.23
Правильное написание для ОВИРа


14-1083663635
Piter
2004-05-04 13:40
2004.05.23
Эстонская водка


14-1083361002
Братан
2004-05-01 01:36
2004.05.23
Кто поможет вспомнить игру?


14-1083579274
Undert
2004-05-03 14:14
2004.05.23
Services