Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с хуком WH_MOUSE


Arnold ©   (2005-01-20 20:04:00) 

Вобщем написал прогу на 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.


begin...end   (2005-01-21 13:53:00) [1]

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

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

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

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


Piter   (2005-01-21 13:42:00) [2]

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

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


begin...end   (2005-01-21 13:24:00) [3]

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

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

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

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

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


Piter   (2005-01-21 12:47:00) [4]

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


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


begin...end   (2005-01-21 08:57:00) [5]

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

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

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


Eraser   (2005-01-21 01:01:00) [6]

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


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

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

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

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


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

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


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


begin...end   (2005-01-20 21:42:00) [9]

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

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

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


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

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

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

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


Piter   (2005-01-20 21:19:00) [11]

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

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:02:00) [12]

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


Arnold   (2005-01-20 20:48:00) [13]

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


Arnold   (2005-01-20 20:47:00) [14]

=)))


Arnold   (2005-01-20 20:46:00) [15]

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


Piter   (2005-01-20 20:45:00) [16]

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


Piter   (2005-01-20 20:45:00) [17]

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


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

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

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


Arnold   (2005-01-20 20:33:00) [18]

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


VMcL   (2005-01-20 20:20:00) [19]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо