Форум: "Начинающим";
Текущий архив: 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.067 c