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

Вниз

Mouse Hook   Найти похожие ветки 

 
Deus   (2002-04-03 10:41) [0]

Написал Mouse Hook.
Главная процедура в DLL:
Function HandleMessage(Code:Integer;wParam:Word;lParam:LongInt): LRESULT;stdcall;
Begin
SendMessage(ShareInf^.AppWndHandle, WM_USER+1, WParam, LParam{Code});
result:=CallNextHookExShareInf^.OldHookHandle,Code,wParam,lParam);
End;

в приложении ловлю wm_user+1(пишу по памяти):
procedure TMainForm.WMUser1(var Message: TMessage);
var
mh:TMOUSEHOOKSTRUCT;
p:tpoint;
x, y:integer;
begin
mh:=TMOUSEHOOKSTRUCT(pointer(message.lparam)^);
p:=mh.pt;
x:=p.x;
y:=p.y;
end;

При перемещениях мышки x и y указывают на позицию курсора.
Но в поределённой области экрана(где-то пикселей 100-200 от краёв) х и y наыинают принимать совершенно безумные значения.
А при подводе курсора к таскбару - вообще происходит AV в mh:=.
что я не так делаю?


 
Виктор Щербаков ©   (2002-04-03 10:57) [1]

Попробуй передавать нужне тебе члены структуры TMOUSEHOOKSTRUCT через ShareInf (если конечно ShareInf - адрес проекции файла).


 
Deus   (2002-04-03 11:03) [2]

Гм...можно попробовать. Но меня больше интересует, почему оно не работает так, как должно. Ведь MSDN гласит:

MouseProc

{Skipped}

LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
);
Parameters
{Skipped}

lParam
[in] Pointer to a MOUSEHOOKSTRUCT structure.

....

MOUSEHOOKSTRUCT
The MOUSEHOOKSTRUCT structure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.

typedef struct tagMOUSEHOOKSTRUCT {
POINT pt;
HWND hwnd;
UINT wHitTestCode;
ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
Members
pt
Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates.


Я думаю, может под XP нужно юзать не MOUSEHOOKSTRUCT, а MOUSEHOOKSTRUCTEX?


 
Виктор Щербаков ©   (2002-04-03 11:11) [3]

Передавая в свою программу lParam, ты передаешь адрес структуры MOUSEHOOKSTRUCT. Этот адрес будет корректен только в адресном пространстве процесса, который должен обработать пришедшее в хук сообщение. Этот самый адрес в твоей программе будет указывать неизвестно куда.
Много раз уже говорилось, что передача указателей между разными процессами (без специальных манипуцляций типа WriteProcessMemory) в лучшем случае бесполезна, а обычно приводит к краху.


 
Deus   (2002-04-03 11:39) [4]

Гм...а разве когда я гружу DLL, она грузится не в МОЁ адресное пространство?


 
Виктор Щербаков ©   (2002-04-03 11:52) [5]

В случае установки глобального хука, dll с функцией ловушки грузится во все процессы, которые (в случае хука на мышь) получают сообщения мыши. В случае других глобальных хуков условия могут быть иными. Исключения: WH_JOURNALRECORD и WH_JOURNALPLAYBACK. Они хоть и называются глобальными, но грузятся только в адресное пространство процесса, поставившего хук.


 
Deus   (2002-04-03 12:09) [6]

Понял. Спасибо за разъяснение.
Offtopic:
а можно как-нибудь из этого хука узнать, в каком процессе он сейчас работает?


 
Виктор Щербаков ©   (2002-04-03 12:11) [7]

То есть?
Если интересует идентификатор процесса, то можно просто вызвать GetCurrentProcessId из хука.


 
Deus   (2002-04-03 12:19) [8]

точно. не сообразил. расслабляет чужая помощь :)))
спасибо большое!



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

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

Наверх




Память: 0.48 MB
Время: 0.017 c
3-17774
Timka
2002-05-10 17:01
2002.06.06
TDBComboBox


6-18074
Rom@nych
2002-03-25 14:30
2002.06.06
Написание прокси


14-18158
JibSkeart
2002-04-29 12:19
2002.06.06
Как установить только BDE с дистрибутива DELPHI6 ??


14-18153
Pat
2002-05-04 00:30
2002.06.06
Hint в Delphi6


1-17983
bmai
2002-05-23 21:28
2002.06.06
Какой язык выбран в данный момент в другом приложении