HotKitten писал(а):и всё-таки на форуме это обсуждалось, в поиске ты быстрее всё найдёшь
HotKitten писал(а):только я с такими вещами никогда не сталкивался, но примерчик держу у себя вдруг пригодится...
keks-n писал(а):Перехватывай API GetMessage (возвращаемое значение), там по любому вылезать должно.
Дело в том, что такой алгоритм почему-то на VB получается КРАЙНЕ медленным и при быстром перемещении мыши указатель не перемещается, только при достаточно медленном.
Matt писал(а):Может кто накидает исходник, проверит и всё-таки выложит?
Эхе-хе, Tarantul, запрашивая координаты курсора мыши каждые 100 раз в секунду вы его не поймаете, гарантирую, так как я не смог его поймать и на скорости в 1000/секунды (т.е. 1мс - минимально допустимая величина установки таймера в VB). С таймером здесь ловить нечего, но похоже хуки не особо быстрее...
ghHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, 0&, IdThread)
'где ghHook – дескриптор устанавливаемой ловушки;
'Public Const WH_MOUSE = 7;
'dwThreadId - идентификатор текущего потока, получаемый с помощью API: GetCurrentThreadId
'MouseProc – пишем сами, если в своём модуле, то получим локальную, если в .dll – глобальную ловушку.
'Шаблон для локальной процедуры MouseProc:
Function MouseProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'где lParam - Pointer to a MOUSEHOOKSTRUCT
'Первый член этой структуры - pt - это указатель на POINTAPI, в которой хранятся текущие координаты курсора мыши.
Dim mhs As MOUSEHOOKSTRUCT
Type POINTAPI
x As Long ‘contains x- and y-coordinates of the cursor, in screen coordinates
y As Long
End Type
Type MOUSEHOOKSTRUCT
pt As POINTAPI
hwnd As Long
wHitTestCode As Long 'Specifies the hit-test value (see WM_NCHITTEST message)
dwExtraInfo As Long 'Specifies extra information associated with the message
End Type
‘*****************************************************************************************
Function MouseProc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If ncode < 0 Then 'обязательно для ncode < 0
MouseProc = CallNextHookEx(ghHook, ncode, wParam, lParam)
Exit Function
End If
CopyMemory mhs.pt.x, ByVal lParam, Len(mhs) ‘CopyMemory продекларируйте заранее
‘
‘теперь в mhs.pt.x и mhs.pt.y у Вас постоянно будут текущие координаты курсора
‘в wParam - будет информация о нажатиях правой и левой кнопках мыши
‘проверяйте их здесь как Вам угодно будет
‘
'передача сообщения по цепочке ловушек
MouseProc = CallNextHookEx(ghHook, ncode, wParam, lParam)
End Function
Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
Dim IdThread As Long
IdThread = GetCurrentThreadId
If hHook = 0 Then hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, 0&, IdThread)
‘hHook соответственно в глоб. переменную.
Public hHook As Long
Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long
Dim IdThread As Long
IdThread = GetCurrentThreadId
If hHook = 0 Then hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc, 0&, IdThread)
Пример из msdn установки 7-ми типов ловушек
_http: // msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/usinghooks.asp
Кстати, у меня If mhs.pt.x = 200 Then MsgBox 200 - ловится - через раз - при быстром перемещении мыши не срабатывает, при медленном - да, т.е. MsgBox лучше не использовать!
Сейчас этот форум просматривают: SemrushBot и гости: 109