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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.048 c
2-1171453350
alles
2007-02-14 14:42
2007.03.04
Проблемы с сетевухой


2-1171439544
sergeyst
2007-02-14 10:52
2007.03.04
Цвет панели


1-1168354965
sia
2007-01-09 18:02
2007.03.04
принудительное закрытие приложения


2-1171276390
Степан
2007-02-12 13:33
2007.03.04
Сохранение паролей


4-1161262695
DevilDevil
2006-10-19 16:58
2007.03.04
Серый Битмап





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский