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

Вниз

Проблема с хуком WH_MOUSE   Найти похожие ветки 

 
Arnold ©   (2005-01-20 20:04) [0]

Вобщем написал прогу на WinApi которая представляетс собой обычное окно. И создал хук на мышку. При щелчке на форму просто появляется сообщение. При запуске на дельфи все нормально работает (хотя редко и так почему то неработает). А когда хочу запустить не из под дельфи т.е. уже скопмилированный exe файл то он почему то при нажатии не выводит сообщение.
В чем тут может быть дело
uses
 SysUtils,
 Windows,
 Messages,
 dialogs;

var
 wc: tagWNDCLASSA;
 MyWindow: HWND;
 MyMouseHook:HHook;
 msg: tagMSG;

function MouseProc(nCode: integer; wParam, lParam: longint): longint; stdcall;
begin
 if MOUSEHOOKSTRUCT(POinter(lparam)^).hwnd=MyWindow then
 if wParam=WM_LBUTTONDOWN then
 begin
  ShowMEssage("");
 end;
  result := CallNextHookEx(MyMouseHook, nCode, wParam, lParam);

end;

function WindowProc(hWnd, Msg, lParam, wParam: dword): dword; stdcall;
begin
 case Msg of
  WM_CREATE:MymouseHook := SetWindowsHookEx(WH_MOUSE, @mouseproc, hInstance,0);
    wm_DESTROY:begin
    UnhookWindowsHookEx(MyMouseHook);
     ExitProcess(0);
    end;

   else result := DefWindowProc(hWnd, Msg, lParam, wParam);
 end;

end;

begin
 ZeroMemory(@wc, SizeOf(wc));
 wc.lpfnWndProc := @WindowProc;
 wc.lpszClassName := "MyClass";
 wc.hInstance := hInstance;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;

 wc.hbrBackground := CreateSolidBrush($FFFFFF);
 wc.hIcon := LoadIcon(0,idi_hand); //çàäàåì èêîíêó
 wc.hCursor := LoadCursor(0, IDC_arrow); //çàäàåì êóðñîð
 wc.style := cs_vredraw or cs_hredraw;
 RegisterClass(wc);

 MyWindow := CreateWindow("MyClass", "Äèñïåò÷åð çàäà÷",
                  ws_overlappedwindow or ws_visible,
                  110, 180, 630, 370, 0, 0, hInstance, nil);

 while GetMessage(Msg, 0, 0, 0) do begin
   TranslateMessage(Msg);
   DisPatchMessage(Msg);
 end;
end.


 
VMcL ©   (2005-01-20 20:20) [1]

http://www.delphimaster.ru/articles/hooks/


 
Arnold ©   (2005-01-20 20:33) [2]

Ни чего нового я там для себя не увидел.
Яж нормально вроде все устанавливаю. Все должно работать.
Пробую хук на клаву все нормально и там и там.
А с мышкой какието проблемы


 
Piter ©   (2005-01-20 20:45) [3]

Arnold ©   (20.01.05 20:33) [2]
Ни чего нового я там для себя не увидел


смотрю в книгу - вижу фигу?

Яж нормально вроде все устанавливаю. Все должно работать

гы, ты будешь поражен насколько ты сейчас глупо доказываешь, что читал эту статью, если ты ее действительно ПРОЧИТАЕШЬ


 
Piter ©   (2005-01-20 20:45) [4]

хотяя... у тебя локальный хук что ли? Просто я к глобальным привык :)


 
Arnold ©   (2005-01-20 20:46) [5]

Ну может все такие не будем здесь выяснять кто прав кто виноват.
Скажите плиз в чем же тут дело??


 
Arnold ©   (2005-01-20 20:47) [6]

=)))


 
Arnold ©   (2005-01-20 20:48) [7]

Конечно локальная !!!
Я в курсах что глобальную через dll нужно устанавливать.
А мне то надо только моего приложения перехватывать


 
Arnold ©   (2005-01-20 21:02) [8]

Кст почему то в Win98 все нормально работает а вот в XP проблема


 
Piter ©   (2005-01-20 21:19) [9]

Понятно, ну тогда давайте по коду:

if MOUSEHOOKSTRUCT(POinter(lparam)^).hwnd=MyWindow then

Странно. А тебе не кажется, что сделать то надо так:

if PMouseHookStruct(lparam)^.hwnd=MyWindow then

function WindowProc(hWnd, Msg, lParam, wParam: dword): dword; stdcall;
begin
case Msg of
 WM_CREATE:MymouseHook := SetWindowsHookEx(WH_MOUSE, @mouseproc, hInstance,0);


странное место для установки хука! Тебе не кажется, что событие WM_CREATE может происходить НЕОДНОКРАТНО, соответственно, каждый раз ты будешь вызывать SetWindowsHookEx и каждый раз перезаписывать MymouseHook? И что MymouseHook уже потеряет всякий смысл в вызове:
result := CallNextHookEx(MyMouseHook, nCode, wParam, lParam);

А вообще, какой смысл в таком хуке то?!
Тебе и так будут поступать все нужные сообщения: WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_LBUTTONUP и так далее в цикл выборки сообщений?


 
Arnold ©   (2005-01-20 21:41) [10]

Хук я ставил не только в WM_CREATE но и в главной программе. Все равно одно и тоже получается.

Сделал я хук потому что в другой программе у меня стоит TreeView и оконная процедура не хочет обрабатывать сообщения пришедшие к этому элементу управления. Вот поэтому я сделал хук
и в другой проге условие имеет вид
if  MOUSEHOOKSTRUCT(POinter(lparam)^).hwnd=hTreeView then

разницу не вижу между ними
PMouseHookStruct(lparam)^.hwnd
MOUSEHOOKSTRUCT(POinter(lparam)^).hwnd
в том и другом случае переменню lparam приводим к типу MOUSEHOOKSTRUCT


 
begin...end ©   (2005-01-20 21:42) [11]

> [9] Piter ©   (20.01.05 21:19)

> if MOUSEHOOKSTRUCT(POinter(lparam)^).hwnd=MyWindow then
> Странно. А тебе не кажется, что сделать то надо так:
> if PMouseHookStruct(lparam)^.hwnd=MyWindow then

А тебе не кажется, что лучше было бы посмотреть в окно CPU?


 
Piter ©   (2005-01-21 00:22) [12]

begin...end ©   (20.01.05 21:42) [11]
А тебе не кажется, что лучше было бы посмотреть в окно CPU?


а что мне надо там посмотреть?


 
VMcL ©   (2005-01-21 00:38) [13]

>>Arnold ©  (20.01.05 20:48) [7]

>А мне то надо только моего приложения перехватывать

SetWindowsHookEx + F1 и внимательно читайте, чему должен быть равен четвёртый параметр (dwThreadId) в случае локального хука.


 
Eraser ©   (2005-01-21 01:01) [14]

Arnold ©
У меня такой вопросик... А зачем тут вообще ХУКИ (SetWindowsHookEx) использовать?!! Нельзя ли просто перехватывать сообщения к окну?


 
begin...end ©   (2005-01-21 08:57) [15]

> [12] Piter ©   (21.01.05 00:22)

> а что мне надо там посмотреть?

Посмотреть, чем отличается ассемблерный код конструкции if MOUSEHOOKSTRUCT(POinter(lparam)^).hwnd=MyWindow от ассемблерного кода конструкции if PMouseHookStruct(lparam)^.hwnd=MyWindow then.


 
Piter ©   (2005-01-21 12:47) [16]

begin...end ©   (21.01.05 8:57) [15]
Посмотреть, чем отличается ассемблерный код конструкции


а разве я говорил, что тот код неправильный? Я просто высказал замечания по коду...
Я считаю, что как я написал - так правильнее


 
begin...end ©   (2005-01-21 13:24) [17]

> [16] Piter ©   (21.01.05 12:47)

> а разве я говорил, что тот код неправильный? Я просто высказал
> замечания по коду...

Ты сказал: "Странно. А тебе не кажется, что сделать то надо так ..."
Вот и непонятно, почему надо делать так, а не эдак, когда компилятор это понимает одинаковым образом. Это всё равно что высказать замечание по коду I := I + 1: "А тебе не кажется, что сделать надо так: Inc(I)?".

> Я считаю, что как я написал - так правильнее

Как бы ты не считал, компилятору в данном случае всё равно. Оснований для того, чтобы считать, что "так правильнее" (для данного случая), я не вижу.


 
Piter ©   (2005-01-21 13:42) [18]

begin...end ©   (21.01.05 13:24) [17]

Такое ощущение, что ты хочешь найти ошибку в моих высказываниях. На здоровье :)


 
begin...end ©   (2005-01-21 13:53) [19]

> [18] Piter ©   (21.01.05 13:42)

Не то что хочу, просто так получилось, что я её нашёл... :-)

Я сам тоже чаще использую приведение к указательному типу (как в твоём варианте). Но не всегда - например, если соответствующий указательный тип не объявлен, я вместо специального его объявления, наверное, предпочту вариант с TMyType(Pointer(XXX)^).

Может быть, я и придираюсь - уж извини. Сессия сейчас, сам понимаешь... нервы... :-(



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

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

Наверх




Память: 0.52 MB
Время: 0.056 c
3-1107363486
frEE)stylEr
2005-02-02 19:58
2005.03.06
Добавить индекс таблицы.


10-1085072175
Grihan
2004-05-20 20:56
2005.03.06
CorelDraw


3-1107077887
Igor_thief
2005-01-30 12:38
2005.03.06
Редактирование в DBGrid


1-1109016306
Wonderer
2005-02-21 23:05
2005.03.06
Товарищ Панов! Это что, не тема сообщения?


3-1107766195
Меджид
2005-02-07 11:49
2005.03.06
Как записать содержимое BLOB поля в Буфер (Clipboard)