1

Тема: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Нужно среагировать на все действия мыши и клавиатуры. Как это сделать? Хотя бы только мыши.

2 (изменено: Александр_, 2011-10-19 11:00:56)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

D_Pavel пишет:

Нужно среагировать на все действия мыши и клавиатуры. Как это сделать? Хотябы только мыши.

OnMessage, если этого мало, то нужно использовать хуки, а для этого нужна dll.

3

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

что-то не работает...

#SingleInstance, Force 
#Persistent

OnMessage(WM_MOUSEMOVE, MyMessageMonitor)
 
MyMessageMonitor(wParam, lParam, msg, hwnd)
{
    MsgBox %wParam%, %lParam%, %msg%, %hwnd%
}
return

4

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

D_Pavel пишет:

что-то не работает...

Во-первых имя функции нужно брать в кавычки, во-вторых WM_MOUSEMOVE будет приходить только когда мышь перемещается над рабочей областью окна(тут основное окно нулевого размера и невидимое).

5

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Александр_ пишет:

то нужно использовать хуки, а для этого нужна dll.

Нет, для отслеживания событий мыши и клавиатуры как раз можно обойтись без dll, попозже напишу.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6 (изменено: D_Pavel, 2011-10-19 18:28:23)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

teadrinker, ок, ждём. Только без циклической проверки координат.

7

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Клавиатурный хук:

   #Persistent
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_KEYBOARD_LL := 13
      , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   Critical
   SetFormat, Integer, H
   ToolTip, % wParam . "| vkCode: " . NumGet(lParam+0, 0) . " scCode: " . NumGet(lParam+0, 4)
      . " Extended: " . NumGet(lParam+0, 8) & 1 . " Time: " . NumGet(lParam+0, 12)
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}

Мышиный хук:

   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", Uint, hHookKeybd)
   ExitApp

LowLevelMouseProc(nCode, wParam, lParam)
{
   ToolTip, % "Message = " . wParam
      . "`nMouse_X = " . NumGet(lParam+0, 0)
      . "`nMouse_Y = " . NumGet(lParam+0, 4)
      . "`nExtended = " . (NumGet(lParam+0, 8)&0xFFFF0000)>>16
      . "`nTime = " . NumGet(lParam+0, 16)
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}

Esc::ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

8 (изменено: D_Pavel, 2011-10-20 10:01:49)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

teadrinker, работает.

9

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Прошу занести это в "Коллекцию скриптов"

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

10

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

А на семёрке работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

11

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

teadrinker пишет:

А на семёрке работает?

Да, и прав администратора не требует. Единственное отличие от предыдущих версий- в случае, если обработчик не укладывается в выделенное системой время на обработку, он вообще удаляется из очереди(ранее в таких случаях просто вызывался следующий обработчик).

12

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

teadrinker пишет:
Александр_ пишет:

то нужно использовать хуки, а для этого нужна dll.

Нет, для отслеживания событий мыши и клавиатуры как раз можно обойтись без dll, попозже напишу.

Однако, написал вариант с использованием dll. Но меня устраивает, то что надо.

13

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Нет, имеется в виду, что для функции-обработчика событий придётся писать отдельную dll, а в моих вариантах она в самом скрипте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

14

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Mikki пишет:

Прошу занести это в "Коллекцию скриптов"

Согласен. А этот скрипт: AHK: Отслеживание времени бездействия мыши. удалите, или перенесите в раздел "Как не надо делать"

15

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

А почему, разве не работает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

16

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Там работает за счет постоянной проверки координат, бесполезная работа впустую когда мышь не двигается. Работает, но не оптимально. То же самое можно сделать на механизме из этой темы, гораздо выгоднее.

17

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Не вижу необходимости удалять работоспособный скрипт.

18

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Если они туда попадают по такому критерию, тогда ладно. Но мне кажется этот вариант лучше чем тот.

19

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Ну, можно дополнить. Первый вариант для начинающего будет понятней.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

20

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

D_Pavel, (выделение моё):

teadrinker пишет:

Ну, можно дополнить. Первый вариант для начинающего будет понятней.

Исключать же скрипт из Коллекции имеет смысл, если он содержит явные ошибки.

21

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

К сожалению, не работает на AHK_L x64; win7 x64.

22

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Попробуй так:

   #Persistent
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_KEYBOARD_LL := 13
      , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return
 
Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp
 
LowLevelKeyboardProc(nCode, wParam, lParam)
{
   Critical
   SetFormat, Integer, H
   ToolTip, % wParam . "| vkCode: " . NumGet(lParam+0, 0, "UInt") . " scCode: " . NumGet(lParam+0, 4, "UInt")
      . " Extended: " . NumGet(lParam+0, 8, "UInt") & 1 . " Time: " . NumGet(lParam+0, 12, "UInt")
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return
 
Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp
 
LowLevelMouseProc(nCode, wParam, lParam)
{
   ToolTip, % "Message = " . wParam
      . "`nMouse_X = " . NumGet(lParam+0, 0, "UInt")
      . "`nMouse_Y = " . NumGet(lParam+0, 4, "UInt")
      . "`nExtended = " . (NumGet(lParam+0, 8, "UInt")&0xFFFF0000)>>16
      . "`nTime = " . NumGet(lParam+0, 16, "UInt")
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}
 
Esc::ExitApp
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

23

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Протестировано, tooltip'а нет.

24

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Для GetModuleHandle тоже надо Fast указать.

25 (изменено: creature.ws, 2011-12-29 15:22:45)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

При DllCall("GetModuleHandle", UInt, 0, "Fast") клавиатурный хук работает так же как и на ahk_l x86; winxp.
Хук мыши же приводит к неподвижности курсора при первом клике.