Форум: "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.036 c