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

Вниз

Я пытаюсь поставить hook на нажатие левой кнопки мыши   Найти похожие ветки 

 
Ик сик   (2003-03-28 16:16) [0]

Я пытаюсь поставить hook на нажатие левой кнопки мыши.
Не могли бы вы проверить этот код и сказать что тут не так?


library Mouse;


uses
Windows,
Dialogs,
Messages,
SysUtils;

var
SysHook : HHook = 0;
Wnd : Hwnd = 0;

function MsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
Wnd:=TMsg(Pointer(lParam)^).hwnd;
if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
showmessage(inttostr(TMsg(Pointer(lParam)^).pt.X));

end;


procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_MOUSE, @MsgProc, HInstance, 0);

if SysHook <> 0 then
ShowMessage("Hook установлен!")
else
Showmessage("Не удалось установить Hook!");

end

else
begin

if UnhookWindowsHookEx(SysHook) then
ShowMessage("Hook снят!")
else
Showmessage("Не удалось снять Hook!");

SysHook := 0;
end;
end;

exports Hook;


begin
end.


 
Ик сик   (2003-03-28 16:40) [1]

Народ, ну пожалуйста...


 
Pogi   (2003-03-28 19:25) [2]

function MsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if Code<0 then
result:=CallNextHookEx(SysHook,Code,wparam,lparam);
else if wparam=WM_LBUTTONDOWN then
begin
...
result:=0;
end;

Что то в этом духе. Твои ошибки: 1)если Code<0 должен вызываться следующий Hook в цепочке. 2)Если сообщение обработано, то функция должна вернуть 0. 3)В Hookе wh_mouse идентификатор сообщения находится в wparam, а в lparam находится указатель на MOUSEHOOKSTRUCT, где есть идентификатор окна,которое получило текущее сообщение. Чтобы проверить работу Hooka, производи запись данных в файл. И еще, вне вышеуказанной конструкции if...else if не должно быть ничего существенного (может быть присвоение данных, но не должно быть никакой обработки). И внимательно читай SDK.


 
Morfein ©   (2003-03-28 20:22) [3]

>> Pogi
В любом случае нужно вызывать CallNextHookEx, а не только если nCode < 0... Просто если nCode < 0, то вызов должен производиться немедленно, без собстенных обработчиков.

>> Ик сик
Проблема может быть в том, что функция устаноыки хука и callback-функция находятся в одной DLL...
И ещё, не надо никогда вызывать из callback-функции модальные функции типа ShowMessage - система может упасть...


 
dim- ©   (2003-03-28 23:07) [4]

Это у меня работает
uses
Windows,
Messages,
Forms,SysUtils;

var
SysHook : HHook = 0; // ОШИБКА !!!
Wnd : Hwnd = 0;

function GetText(wnd:hwnd):string;
var p:array [0..256] of char;
begin
//with fmWinAPi do
GetWindowText(wnd,p,255);
result:=strpas(p);
end;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code = HC_ACTION then
begin
Wnd:=TMsg(Pointer(lParam)^).hwnd;
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
MessageBox(0, PChar("Обработчик мышки !"+GetText(Wnd)), "Нажата правая кнопка мышки", 0);
end;
Result:= CallNextHookEx(SysHook, Code, wParam, lParam);
end;

{ Процедура установки HOOK-а}
procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
if SysHook = 0 then
MessageBox(0, "HOOK1 установить не удалось !", "Message from Exampel1/Process1", 0);
end
else
begin

if not UnhookWindowsHookEx(SysHook) then
MessageBox(0, "HOOK1 снять не удалось !", "Message from Exampel1/Process1", 0);
SysHook := 0;
end;
end;

exports hook;

begin

end.


 
Ик сик   (2003-03-29 10:51) [5]

Ребята, спасибо большое.

Еще пара вопросов:

Как из MOUSEHOOKSTRUCT получить идентификатор окна и главное координаты нажатия мышки?

Если всегда нужно вызывать CallNextHookEx, то 0 в случае успеха не возвращать?


> Проблема может быть в том, что функция устаноыки хука и
> callback-функция находятся в одной DLL...

Поместить их в разные dll?


 
Ик сик   (2003-03-29 12:17) [6]

Отменяется, нашел.
Еще раз спасибо большое.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
3-83410
Kirill_S
2003-05-06 18:36
2003.05.26
вывести данные из TEdit в QReport


14-83688
Mak
2003-05-05 14:04
2003.05.26
Crystal Report


11-83428
sandrolich
2002-08-19 11:42
2003.05.26
Рисование KOL


14-83664
yaJohn
2003-05-05 17:17
2003.05.26
Грабли с ИнсталШилдЕкспресс - запись бинарного поля в реестр.


1-83467
Добрый Ээх
2003-05-14 23:54
2003.05.26
Скролинг и StringGrid