Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

Проблема с хуком 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.039 c
1-1108897722
Kosald
2005-02-20 14:08
2005.03.06
Как сделать так, чтобы форма отображалась всегда поверх окон


14-1108101125
BoxTer
2005-02-11 08:52
2005.03.06
Исходники Windows 98


10-1084796970
VK220
2004-05-17 16:29
2005.03.06
Здравствуйте! Если функция _AddRef вызывается при любом обращении


1-1109004521
Viktop
2005-02-21 19:48
2005.03.06
Как затенить кнопку закрыть


1-1108545105
Denis
2005-02-16 12:11
2005.03.06
Ошибка при работе с DLL





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