Форум: "WinAPI";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c