Форум: "WinAPI";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Вниз
Я пытаюсь поставить 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c