Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизМышка Найти похожие ветки
← →
Ivolg (2004-09-18 14:37) [0]Здравствуйте! Помогите мне пожайлуста! Пасиба заранеее! Как мне отловить нажатее мышки(левую кнопку, правую и колёсико, и колёсико вверх и вниз и нажатее на колёсико),не только на форме, а везде???
← →
KSergey © (2004-09-18 15:34) [1]Везде в пределах своего приложения? Или вообще "везде"?
Для своего - Application.OnMessage.
Про везде - другие специ подскажут, а то я навру.
← →
[lamer]Barmaglot © (2004-09-18 15:46) [2]то KSergey © (18.09.04 15:34) [1]
Ну это уже совсем другой уровень...
Что бы отловить нажатие мышки вне своего приложения, надо ставить Hook - описание как это делается в статьях или у рихтера, но еще раз повторю - совсем другой уровень...
Для отлавливания нажатия мышки в виндовсе используются следующие сообщения:
WM_LButtonDblClk
WM_LButtonDown
WM_LButtonUp
WM_MButtonDblClk
WM_MButtonDown
WM_MButtonUp
....
WM_MouseWheel
...
WM_RButtonDblClk
WM_RButtonDown
WM_RButtonUp
...
WM_XButtonDblClk
WM_XButtonDown
WM_XButtonUp
и т.д. подробнее смотреть в Platform SDK или здесь: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/m ouseinputreference/mouseinputmessages/wm_lbuttonup.asp
Можно еще использовать Capture мыши, но его действие тебе врядли понравится...Хотя... Вот ф-ции: SetCapture, ReleaseCapture...
← →
Ivolg (2004-09-19 11:46) [3][lamer]Barmaglot
чё-то я не разобоался!
← →
Kovsh (2004-09-19 14:45) [4]Вот код модуля:
Library HookDLL;
Uses
Windows, Messages, SysUtils;
Const
GlMapID = "5557555577775"; // Чтобы не перекрывались одни хуки другими
Type
PShareInf = ^TShareInf;
TShareInf = Record
AppWndHandle: HWND;
OldHookHandle: HHOOK;
hm:THandle;
end;
Type
PShareI = ^TShareI;
TShareI = Record
AppWndH: HWND;
OHH: HHOOK;
hm2:THandle;
End;
Var
MapHandle: THandle = 0;
ShareInf: PShareInf = nil;
ShareI: PShareI = nil;
ptr:PByteArray;
Procedure DLLEntryPoint(dwReason: DWORD); stdcall;
Begin
Case dwReason Of
DLL_PROCESS_ATTACH:
Begin
MapHandle:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareInf), GlMapID);
ShareInf:=MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
End;
DLL_PROCESS_DETACH:
Begin
UnMapViewOfFile(ShareInf);
CloseHandle(MapHandle);
End
End;
End;
// Для мыши
Procedure DLLEntryP(dwR: DWORD); stdcall;
Begin
Case dwR Of
DLL_PROCESS_ATTACH:
Begin
MapHandle:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareI),"55575557888775");
ShareI:=MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareI));
End;
End;
End;
Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
SendMessage(ShareInf^.AppWndHandle, WM_USER+25, ParamW, Code);
SendMessage(ShareInf^.AppWndHandle, WM_USER+27, ParamL, Code);
End;
Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL)
End;
Function MouseHook(Code: Integer; pos: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
SendMessage(ShareI^.AppWndH, WM_USER+15, pos, Code);
End;
Result := CallNextHookEx(ShareI^.OHH, Code, pos, ParamL)
End;
Function SetMouseHook(Wnd: HWND): BOOL; stdcall;
Begin
If ShareI<>Nil Then
Begin
ShareI^.AppWndH:=Wnd;
ShareI^.OHH:=SetWindowsHookEx(WH_mouse, @MouseHook, HInstance, 0);
Result:=ShareI^.OHH<>0;
End
Else Result:=False
End;
Exports
SetMouseHook;
Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall;
Begin
If ShareInf<>Nil Then
Begin
ShareInf^.AppWndHandle:=Wnd;
ShareInf^.OldHookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook, HInstance, 0);
Result:=ShareInf^.OldHookHandle<>0;
End
Else Result:=False
End;
Function RemoveKeyboardHook: BOOL; stdcall;
Begin
Result := UnhookWindowsHookEx(ShareInf^.OldHookHandle);
CloseHandle(ShareInf^.hm);
End;
Exports
SetKeyboardHook, RemoveKeyboardHook, SetMouseHook;
BEGIN
DLLEntryPoint(DLL_PROCESS_ATTACH);
DLLEntryP(DLL_PROCESS_ATTACH);
END.
Ловит действия клавиш и мышки. Посмотри в факе, там вроде был
хороший пример. Статья есть по хукам.
← →
Ivolg (2004-09-20 10:38) [5]Kovsh
А где можно статью такую найти, по хукам. А то в факе нету!! Спасибо за код!
← →
Digitman © (2004-09-20 11:46) [6]
> Ivolg (20.09.04 10:38) [5]
хук типа WH_JOURNALRECORD является system-wide и позволяет при этом регистрировать события мыши/клавы во всех GUI-приложениях без использования хук-dll
Страницы: 1 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.044 c