Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-83469
User
2003-05-14 16:09
2003.05.26
доступ к структуре из разных классов?


3-83389
AlexA
2003-04-29 16:10
2003.05.26
происходит рестарт IB сервера.


14-83663
Leran2002
2003-05-05 17:19
2003.05.26
Проблема с SetSystemTime


3-83336
Nikos
2003-05-03 23:10
2003.05.26
Не могу организовать поиск методом Locate


4-83795
Num Lock
2003-03-26 15:21
2003.05.26
Как без окна обработать сообщения от всплывающего меню?





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