Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-17888
Explorer
2002-05-24 10:30
2002.06.06
Такая вот проблемка с отчетами в PReport


6-18075
interier
2002-03-22 10:50
2002.06.06
Как посмотреть - не занят ли порт?


1-17881
eviruswork
2002-05-24 18:41
2002.06.06
qtintf.dll


1-17978
Stanbab
2002-05-28 11:38
2002.06.06
Форма в пакете


3-17823
vopros
2002-05-16 15:15
2002.06.06
Как в dgridEh ролик перемещения показывал реалное смщение по базе





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