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

Вниз

KeyBoard Hook   Найти похожие ветки 

 
AzzHell ©   (2007-02-13 22:33) [0]

Привет всем кто счёл нужным прочитать мою проблемку. Заранее благодарю тех кто ещё и сможет мне помочь.
Есть у меня библиотека ентого ХУКА, которая должна перехватывать нажатие клавиш от любой программы. Она это делает - перехватывает, и даже может об этом сообщить. Проблема в том что немогу я выдрать код той самой нажатой кнопочки, уж что я только не пробовал... Привожу текст той самой библиотеки ( в сокращении ) -

function Key_Hook(Code: integer; wParam: word;
lParam: Longint): Longint; export;
var
H: HWND;
begin
{если Code>=0, то ловушка может обработать событие}
if Code >= 0 then
begin
{это те клавиши?}
if ((wParam = VK_ADD)or(wParam = VK_SUBTRACT)) and (lParam and $40000000 = 0) then
begin
{ищем окно по имени класса и по заголовку}
H := FindWindow("TForm1", "XXX");
{посылаем сообщение}
if wParam = VK_ADD then
SendMessage(H, wm_NextShow_Event, 0, 0)
else
SendMessage(H, wm_PrevShow_Event, 0, 0);
end;
{если 0, то система должна дальше обработать это событие}
{если 1 — нет}
Result:=0;
end
else
{если Code<0, то нужно вызвать следующую ловушку}
Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;

{при выгрузке DLL надо снять ловушку}
procedure LocalExitProc; far;
begin
if HookHandle<>0 then
begin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;

{инициализация DLL при загрузке ее в память}
begin
{устанавливаем ловушку}
HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
if HookHandle = 0 then
MessageBox(0, "Unable to set hook!", "Error", mb_Ok)
else begin
SaveExitProc := ExitProc;
ExitProc := @LocalExitProc;
end;
end.


 
Leonid Troyanovsky ©   (2007-02-13 22:37) [1]


> AzzHell ©   (13.02.07 22:33)  

> Есть у меня библиотека ентого ХУКА, которая должна перехватывать


В печь ее.
В соседнем треде есть про WH_KEYBOARD_LL - библиотеки больше
не требуется.

--
Regards, LVT.


 
AzzHell ©   (2007-02-13 22:43) [2]

В печь так в печь! Так даже лучше будет. И ента функция перехватывает от любой проги нажатие?


 
Leonid Troyanovsky ©   (2007-02-13 22:51) [3]


> AzzHell ©   (13.02.07 22:43) [2]

> В печь так в печь! Так даже лучше будет. И ента функция
> перехватывает от любой проги нажатие?


Это не функция, а хук - отладочная метода.
Ну, а, в общем-то, перехватывает.
Не от любой, конечно, а, скажем - в пределах одного десктопа.

--
Regards, LVT.


 
AzzHell ©   (2007-02-13 22:59) [4]

А где можно узнать поподробней? В справке делфи её нет,  или хоть какой пример...


 
Leonid Troyanovsky ©   (2007-02-13 23:02) [5]


> AzzHell ©   (13.02.07 22:59) [4]

>  или хоть какой пример...

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/ba088c4f6ad9649f

--
Regards, LVT.


 
AzzHell ©   (2007-02-13 23:14) [6]

.....
function  LowLevelKeyboardProc(nCode :Longint; awParam: WParam; alParam:LParam): DWord; stdcall;
var
 fEatKeystroke: Boolean;
 p: PKBDLLHOOKSTRUCT;
 buf: array [0..255] of Char;
 sc: UINT;
begin <<<< тут Делфя (6) выдаёт ошибку.
.....


 
Leonid Troyanovsky ©   (2007-02-13 23:16) [7]


> AzzHell ©   (13.02.07 23:14) [6]

>  sc: UINT;
> begin <<<< тут Делфя (6) выдаёт ошибку.

Подробней.

--
Regards, LVT.


 
AzzHell ©   (2007-02-13 23:23) [8]

""Statements not allowed in interface part""


 
Leonid Troyanovsky ©   (2007-02-13 23:27) [9]


> AzzHell ©   (13.02.07 23:23) [8]

> ""Statements not allowed in interface part""


Не очень понятно. Код юнита - в студию.
Только, плиз, без отсебятины.

--
Regards, LVT.


 
AzzHell ©   (2007-02-13 23:31) [10]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private
   { Private declarations }

 public
   { Public declarations }
 end;

const
 WH_KEYBOARD_LL = 13;
 WH_MOUSE_LL = 14;

 LLKHF_EXTENDED = KF_EXTENDED shr 8;
 LLKHF_INJECTED = $00000010;
 LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
 LLKHF_UP = KF_UP shr 8;

 LLMHF_INJECTED = $00000001;

{ Structure used by WH_KEYBOARD_LL }
type
 tagKBDLLHOOKSTRUCT  = packed record
   vkCode : DWord;
   scanCode : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 TKBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
 PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;

{ Structure used by WH_MOUSE_LL }
 tagMSLLHOOKSTRUCT = packed record
   pt : TPoint;
   mouseData : DWord;
   flags : DWord;
   time : DWord;
   dwExtraInfo : PDWord;
 end;
 tMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
 PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;

function  LowLevelKeyboardProc(nCode :Longint; awParam: WParam; alParam:LParam): DWord; stdcall;
var
 fEatKeystroke: Boolean;
 p: PKBDLLHOOKSTRUCT;
 buf: array [0..255] of Char;
 sc: UINT;
begin
  fEatKeystroke := False;

  if (nCode = HC_ACTION) then
     case (awParam) of
      WM_KEYDOWN, WM_SYSKEYDOWN,
      WM_KEYUP, WM_SYSKEYUP:
        begin
         p := PKBDLLHOOKSTRUCT(alParam);
         fEatKeystroke :=
           ((p.vkCode = VK_TAB) and (p.flags and LLKHF_ALTDOWN <> 0)) or
           ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
           ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000)<>0));
        end;
      end;

  if fEatKeystroke then
    Result := 1
  else
    Result := CallNextHookEx(0, nCode, awParam, alParam);
end;

var
 hhk: HHOOK;

 Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 hhk:= SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 UnHookWindowsHookEx(hhk);
end;

end.


 
Leonid Troyanovsky ©   (2007-02-13 23:33) [11]


> Leonid Troyanovsky ©   (13.02.07 23:27) [9]

> > ""Statements not allowed in interface part""


А.. Ну, да.. Уж. Оно ж д.б. в implementation.

Брысь в "Начинающие", пока не заклевали.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-02-13 23:34) [12]


> AzzHell ©   (13.02.07 23:31) [10]


В implementation!
Т.е., в "Начинающие".

--
Regards, LVT.


 
AzzHell ©   (2007-02-13 23:37) [13]

Удалено модератором


 
AzzHell ©   (2007-02-13 23:48) [14]

Вот так выдаёт ошибку несоответствия типов Integer и Cardinal -

 hhk:= SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,instance, 0);

А так нет -

 hhk:= SetWindowsHookEx(WH_KEYBOARD_LL,@LowLevelKeyboardProc, Hinstance, 0);

В чём разница и будет ли от этого различие в алгоритме?


 
Leonid Troyanovsky ©   (2007-02-14 00:07) [15]


> AzzHell ©   (13.02.07 23:48) [14]

> В чём разница и будет ли от этого различие в алгоритме?

В первом случае компилятор требует совпадения возвращаемого
результата в прототипе LowLevelKeyboardProc.
Т.е., ему не нравится DWORD vs LRESULT.
И нужно описывать:
function  LowLevelKeyboardProc(..): LRESULT; stdcall;
(здесь, как ни странно, ошибся не борланд, а я).

Во втором случае компилятор полагается на программиста.

Ну, и, в данном конкретном случае - на высоту полетов оно не влияет.

--
Regards, LVT.


 
AzzHell ©   (2007-02-14 00:21) [16]

>Leonid Troyanovsky
Огромное спасибо! Всё работает и хукает.

>function  LowLevelKeyboardProc(..): LRESULT; stdcall;
>(здесь, как ни странно, ошибся не борланд, а я).

Это ошибка??? А поставить Function перед Implementation слабо?
Стыдно мне, а ещё про хуки спрашиваю....


 
Leonid Troyanovsky ©   (2007-02-14 00:26) [17]


> AzzHell ©   (14.02.07 00:21) [16]

> Это ошибка???

Конечно. Получается, что бросил тень подозрения на Джефа.
Сам не могу понять, откуда у меня DWORD возник.
Видимо, уж очень вольно переводил.

--
Regards, LVT.



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

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

Наверх




Память: 0.51 MB
Время: 0.04 c
15-1170817081
SerJaNT
2007-02-07 05:58
2007.03.04
Вот, рюмку нарисовал..


2-1171621980
Tolibas
2007-02-16 13:33
2007.03.04
fsMDIForm - > fsMDIChild -> fsNormal


15-1171120415
Ученик чародея
2007-02-10 18:13
2007.03.04
Автоматизированное обновление программ.


2-1171122427
verywell
2007-02-10 18:47
2007.03.04
if, exit,... что лучше?


15-1170642121
Expell
2007-02-05 05:22
2007.03.04
Корреляция