Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.025 c
1-1097213373
Fynjy1984
2004-10-08 09:29
2004.10.24
Dll


1-1096498695
VlaDD
2004-09-30 02:58
2004.10.24
Как организовать нормальный "рандом"??


1-1097255076
Anwy
2004-10-08 21:04
2004.10.24
Изминение размера линейного масива


6-1092318382
TARIK
2004-08-12 17:46
2004.10.24
FTP HTTP в локальной сети


3-1096445145
Павел Боровик
2004-09-29 12:05
2004.10.24
Длина поля в DBF