Форум: "Основная";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
ВнизКак передать указатель на структуру из DLL Найти похожие ветки
← →
Alexey Frolov (2002-03-06 11:51) [0]Я пишу глобальный HOOK на мышь. В главной программе надо отслеживать все ее перемешения.
Проблема в следующем: когда мышь находится над "cвоей" формой-все работает. Когда мышь выходит за пределы формы начинабтся проблемы.
Я попробовал 3 варианта передачи указателя на структуру tagMOUSEHOOKSTRUCT в сообщении.
1. tagMOUSEHOOKSTRUCT размещается вместе с глобальной информацией
В таком варианте комп отвисает
Type
PShareInf = ^TShareInf;
PMouseStruct = ^tagMOUSEHOOKSTRUCT;
TShareInf = Record
AppWndHandle: HWND;
KeyboardHookHandle: HHOOK;
MouseHookHandle: HHOOK;
hm:THandle;
KeyboardMsgId:integer;
MouseMsgId:integer;
pStruct:PMouseStruct;
cData:tagMOUSEHOOKSTRUCT;
End;
Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
/////////////////////////////////////////////////////////////////
ShareInf^.pStruct:=Pointer(ParamL);
ShareInf^.cData.pt.X:=ShareInf^.pStruct^.pt.X;
ShareInf^.cData.pt.Y:=ShareInf^.pStruct^.pt.Y;
/////////////////////////////////////////////////////////////////
SendMessage(ShareInf^.AppWndHandle,ShareInf^.MouseMsgId,integer(@ShareInf^.cData), Code);
End;
Result := CallNextHookEx(ShareInf^.KeyboardHookHandle, Code, ParamW, ParamL)
End;
2. Во 2 и 3 вариантах выдаются ошибки "Access violation"
Type
PShareInf = ^TShareInf;
PMouseStruct = ^tagMOUSEHOOKSTRUCT;
TShareInf = Record
AppWndHandle: HWND;
KeyboardHookHandle: HHOOK;
MouseHookHandle: HHOOK;
hm:THandle;
KeyboardMsgId:integer;
MouseMsgId:integer;
End;
Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var
pStruct:PMouseStruct;
cData:tagMOUSEHOOKSTRUCT;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
pStruct:=Pointer(ParamL);
cData.pt.X:=pStruct^.pt.X;
cData.pt.Y:=pStruct^.pt.Y;
SendMessage(ShareInf^.AppWndHandle, ShareInf^.MouseMsgId, integer(@cData), Code);
End;
Result := CallNextHookEx(ShareInf^.KeyboardHookHandle, Code, ParamW, ParamL)
End;
3.
Type
PShareInf = ^TShareInf;
PMouseStruct = ^tagMOUSEHOOKSTRUCT;
TShareInf = Record
AppWndHandle: HWND;
KeyboardHookHandle: HHOOK;
MouseHookHandle: HHOOK;
hm:THandle;
KeyboardMsgId:integer;
MouseMsgId:integer;
End;
Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var
pStruct:PMouseStruct;
cData:tagMOUSEHOOKSTRUCT;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
SendMessage(ShareInf^.AppWndHandle, ShareInf^.MouseMsgId, ParamL, Code);
End;
Result := CallNextHookEx(ShareInf^.KeyboardHookHandle, Code, ParamW, ParamL)
End;
Обработчик сообщения во всех случаях одинаков:
Procedure TMainForm.WM_MouseMessage(var Message: TMessage);
var
cData:tagMOUSEHOOKSTRUCT;
pStruct:PMouseStruct;
Begin
pStruct:=Pointer(Message.WParam);
cData.pt.X:=pStruct^.pt.X;
cData.pt.Y:=pStruct^.pt.Y;
Memo2.Lines.Clear();
Memo2.Lines.Add("Mouse Event");
Memo2.Lines.Add("X:="+IntToStr(cData.pt.X)+" Y:="+IntToStr(cData.pt.y));
End;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.21;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c