Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
1-1083750218
Aleksandr
2004-05-05 13:43
2004.05.23
Как прочитать все значения из ветки реестра?


14-1083316983
mfender
2004-04-30 13:23
2004.05.23
Развод с широким размахом?


8-1078222209
badry
2004-03-02 13:10
2004.05.23
звук


1-1084029702
DDA
2004-05-08 19:21
2004.05.23
PByteArray


3-1082704368
msguns
2004-04-23 11:12
2004.05.23
Парадокс с Paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский