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.
Хук мыши же приводит к неподвижности курсора при первом клике.

26

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

YMP пишет:

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

Не совсем понял, как это?
Может, нужно учесть наличие Unicode и ANSI версий GetModuleHandle()? creature.ws, попробуй в последнем моём варианте заменить GetModuleHandle на GetModuleHandleW.

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

27

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

creature.ws пишет:

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

А у меня не приводит. Хотя вообще движется курсор как слегка больной. Я бы так работать не хотел, конечно.
Win7/64 HE SP1, AHK_64 1.1.05.04

28

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

Да откуда ты этот Fast в DllCall() взял?

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

29

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

teadrinker
Я что-то сам не пойму. Я подумал, что Fast — это соглашение вызова на 64 битах (fastcall). Но судя по описанию RegisterCallback, это не то. Да и по идее AHK_64 по умолчанию должен fastcall использовать. К сожалению, я с ним дела практически не имел, использую AHK_L 32 Unicode.

30

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

Чудеса: я сейчас вместо "Fast" поставил чисто от балды "Abc" — тоже помогает!

31

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

Может, за "Cdecl" принимает? (Правда, я не очень понимаю, что это такое).

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

32

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

Понял, что тут работает: при всех этих левых добавках GetModuleHandle возвращает пустое значение. Можно вместо него просто передать 0.

Кстати, вроде там и нужен ноль по идее.

SetWindowsHookEx Function пишет:

hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.

dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.

Может, логика такая, что all existing threads running in the same desktop as the calling thread включают и саму calling thread, т.е. ты как бы её указал. К тому же the hook procedure ведь не в DLL.

teadrinker

Может, за "Cdecl" принимает? (Правда, я не очень понимаю, что это такое).

Cdecl отличается от stdcall только тем, что вызванная функция при выходе не меняет указатель стека так, чтобы переданные ей параметры оказались в свободной части стека. За неё это должен сделать вызывающий код. В Windows API cdecl практически нет. Только функцию wsprintf знаю. Ну и функции в msvcrt.dll, но это ведь не часть API, а "C runtime".

33

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

Во всяком случае, у меня на XP c нулём вместо GetModuleHandle не прокатывает ни тот, ни другой хук.

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

34

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

При DllCall("GetModuleHandleW", UInt, 0) не работает.
При передаче нуля - tooltip показывается, 1-2 клика обрабатываются - курсор останавливается.
После закрытия скрипта курсор рывком перемещается в точку куда был бы переведен, не будь он обездвижен

35

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

teadrinker
Да, на ХР не работает с нулём. Остаётся, видимо, проверять версию АНК и использовать либо hModule, либо нуль.

creature.ws
У Вас винда кривая. Наверно, не все 64 бита положили, пересчитайте.
Возможно, ещё какой-то скрипт работает и мешается под ногами?

36 (изменено: creature.ws, 2011-12-30 00:19:22)

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

Видимо так
Проверил после перезагрузки при отключенном основном скрипте, более в системе посторонних хуков мыши никто ставить вроде бы не должен.

Service Pack 1 Build 7601, x64-based,  68 Hotfix(s) Installed; Ahk_L U x64 1.1.05.05

37

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

А можно как нибудь перехватывая нажатия клавиатуры, узнавать не только код клавиши, а и буквы, при соответствующей раскладке клавиатуры?

Сохранение буфера обмена, выполнаю с помощью подпрограмы OnClipboardChange, удобно вести историю копируемого, но вот хотелось бы сохранять у себя на компьютере, еще и все, что набирается на клавиатуре, а стороннее ПО использовать для этого не охота.

http://alucky.globus-inter.com

38

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

Вот, а также была соответствующая тема в разработке, ищи, там подробнее.

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

39 (изменено: BalRoG, 2012-03-09 16:31:59)

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

Огромное вам спасибо всем за скрипты!!!
На Windows 7 x64 Autohotkey_L 1.1.07.01 работает

40

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

Жаль, на AHK_L x64 мышиный хук приводит к обездвиживанию курсора при первом-втором клике.

41

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

Посмотри, может там где-то "UInt" нужно заменить на "UPtr".

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

42 (изменено: creature.ws, 2012-03-09 19:56:19)

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

Спасибо за рекомендацию, попробовав вариант с заменой UInt на Ptr во всех подходящих местах и не получив желаемого результата, решил таки проверить скрипт на свежеустановленной на вм аналогичной системе. Работает в оригинальном виде при hMod = 0
Вероятно, подтвердилось сказанное выше:

creature.ws
У Вас винда кривая.

Мои извинения за ложные багрепорты

43

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

Есть одно замечание по скрипту. Насколько мне известно, в функциях низкоуровневого хука следует проверять значение аргумента nCode, если nCode < 0, процедура должна немедленно вызвать CallNextHookEx и вернуть значениe этой функции, обработка же хука осуществляется только при nCode >= 0.

44 (изменено: kirtech, 2012-03-10 01:49:54)

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

afinagen да, именно так и об этом пишут на MSDN:

LowLevelMouseProc

LowLevelKeyboardProc

мой пример перехвата нажатий клавиш на Purebasic

45 (изменено: BalRoG, 2012-05-11 17:52:22)

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

Может кому пригодится у кого сложности как у меня со скриптингом - функция для автохоткея чтобы выводить полученные сканкоды и виртуалкеи в формате в котором работает сам автохоткей
необходимые параметры - сам код, далее extended информация (0 или 1 - добавляется 3ий разряд к сканкоду) и сам мод - SC или VK

KeyCodeGetHex(number,extend,mode) {
    arrMods:=["16","1"]
    if (mode="sc") {
        SetFormat, Integer, D
        result:=extend+0
        SetFormat, Integer, H
    }
    Loop, 2
    {
        tmp:=Mod(number//arrMods[A_Index],16)
        StringTrimLeft, tmp, tmp, 2
        result.=tmp
    }
    Return mode . result
}

46

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

afinagen пишет:

Есть одно замечание по скрипту. Насколько мне известно, в функциях низкоуровневого хука следует проверять значение аргумента nCode, если nCode < 0, процедура должна немедленно вызвать CallNextHookEx и вернуть значениe этой функции, обработка же хука осуществляется только при nCode >= 0.

В моём примере CallNextHookEx возвращается в любом случае. Что же до ситуации, когда nCode < 0, то вот такой скрипт

   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 % nCode
   if nCode < 0
      SoundBeep
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}
 
Esc::ExitApp

показывает, что подобного в данном варианте установки хука просто не происходит.

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

47 (изменено: BalRoG, 2012-05-11 17:53:33)

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

Прошу подскажите, пожалуйста, как сделать, чтобы эти низкоуровненые хуки не ловили то, что шлет Autohotkey?

48

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

Ты имеешь в виду нажатия клавиш, или что?

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

49

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

допустим мы сделали Hotkey в скрипте - на F1 у нас вместо F1 жмется F2, тогда хуки это увидят так: F1 Down F2 Down F2 Up F1 Up, то есть хуки видят не только физические нажатия пользователя по клаве, но и виртуальные нажатия посылаемые автохоткеем, вот подскажите очень очень прошу, как сделать чтобы эти виртуальные нажатия не хукались?

50

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

if(NumGet(lParam|0, 8, "uint")&16)
   ...

51

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

огромное спасибо

52

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

А зачем нужны эти хуки? Можно этот процесс убрать как-то? - комп тормозит, и там  конфликты с другими приложениями, что-ли, могут возникнуть?

53

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

natalie31 пишет:

А зачем нужны эти хуки?

Тема по хукам, код обновлён для использования с любыми версиями AHK_L (но не AHK-basic). Если код написан верно, никаких конфликтов и тормозов не должно быть.

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

54 (изменено: Borodas, 2012-06-24 01:22:16)

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

Удалено

55

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

Borodas, какое отношение твой вопрос имеет к названию темы? Перед началом общения на форуме нужно ознакомиться с Правилами, в частности с этим. Ну и вот это ещё почитать не помешает.

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

56 (изменено: Borodas, 2012-06-24 01:22:48)

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

Удалено

57

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

Borodas пишет:

В таком случае я прошу Вашего совета, Что мне делать, Создавать новую тему?, писать в существующую?

Создайте новую тему.

58

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

Time paradox:
http://s018.radikal.ru/i515/1206/01/8f7b1a223f2at.jpg
(внимание на даты постов).

59

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

OFF: Да, есть такой "скачок" времени.

60

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

Я видел. Судя по тому, что некоторое время хостинг отпинывал запросы на обслуживание — проблемы были на его стороне.

61

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

Borodas,  вопросы вроде "Помогите плиз написать скрипт" задавать только в новой теме!

62

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

ОК спасибо! Создаю новую тему. Модератора или администратора просьба удалить мои посты из этой темы.

63

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

teadrinker
Клавиатурный хук в коллекции неправильно определяет SC код некоторых кнопок, например: RShift, NumpadEnter.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

64

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

Да, исправлю.

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

65

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

Исправлено.

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

66

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

Надо ещё мышиный подправить, наверное.

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

67

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

А с мышиным что не так?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

68

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

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

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

69

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

А Я подумал, что что-то не так определяло.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

70

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

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

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

71

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

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

SetTimer, EventHandling, -10

Но, если за 10 мсек произойдёт например 2-3 события (такое возможно например при искуственном вводе), то последнее событие обновит таймер предыдущих, и мы не узнаем о них.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

72

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

Да, но если события будут происходить до завершения обработки предыдущих в хуке, будут задержки, а иногда и сбои, залипания клавиш, и ещё всякие неприятности.

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

73

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

Ещё такой вопрос: можно ли изменять статус клавиши? Например зажали "RButton", и надо теперь чтобы при отпускании её, "RButton Up" не прошло в активное окно, но также чтобы она не осталась залипшей.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

74

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

Да как-то не задумывался. А для чего это конкретно нужно?

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

75

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

Ну например организовать RButton & LButton хоткей.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

76

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

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

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

77 (изменено: serzh82saratov, 2015-07-11 18:08:47)

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

Ещё раз попробовал решить вопрос, не пойму в чём дело, что то не так с lParam в массиве?

+ открыть спойлер

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

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

LowLevelKeyboardProc(nCode, wParam, lParam)
{
    static oMem := [], q := 0, w := 0
        , oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP", 0x104: "WM_SYSKEYDOWN", 0x105: "WM_SYSKEYUP"}
     
    oMem.Push([wParam, lParam]), ++q 
    SetTimer, EventHandling, -10   ; обработку событий "повесим" на таймер, чтобы не создавать помех в работе клавиатуры
    Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
 
EventHandling:  
    While (oMem[1] != "") 
    {  
        wp := oMem[1][1], lp := oMem[1][2] 
        oMem.RemoveAt(1) 
        
        SetFormat, IntegerFast, H
        msg := wp . ""                       ; добавляем "", чтобы шестнадцатеричное число интерпретировалось, 
        vk  := NumGet(lp + 0, "UInt") . ""   ; как строка, и не превратилось в десятичное после смены формата
        ext := NumGet(lp + 8, "UInt") 
        sc  := NumGet(lp + 4, "UInt") | (ext & 1) << 8 . "" 
        SetFormat, IntegerFast, D
        time := NumGet(lp + 12, "UInt")
         
        ToolTip % "Message = "  . oMsg[msg]
                . "`nvkCode = " . vk
                . "`nscCode = " . sc
                . "`nTime = "   . time 
                . "`nPhysical = "   . (ext & 16 ? "Not" : "Yes")
                . "`n " q "   " ++w "   " oMem.MaxIndex() 
        Sleep 100
    } 
    Return
} 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

78

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

Ещё актуально? В чём там проблема?

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

79 (изменено: serzh82saratov, 2015-07-13 23:09:38)

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

vk, sc то есть, то пустые, и неправильные.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

80 (изменено: teadrinker, 2015-07-14 01:02:33)

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

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

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

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   static oMem := [], q := 0, w := 0
      , oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP", 0x104: "WM_SYSKEYDOWN", 0x105: "WM_SYSKEYUP"}
   
   arr := {}
   arr.msg := Format("{:#x}", wParam)
   arr.vk  := Format("{:#x}", NumGet(lParam + 0, "UInt"))
   ext := NumGet(lParam + 8, "UInt") & 1
   arr.sc := Format("{:#x}", NumGet(lParam + 4, "UInt") | ext << 8)
   arr.ext := ext
   arr.time := NumGet(lParam + 12, "UInt")
   
   oMem.Push(arr), q++
   
   SetTimer, EventHandling, -10
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
   
EventHandling:
   while oMem[1] != ""  {
      msg := oMem[1].msg
      vk := oMem[1].vk
      sc := oMem[1].sc
      ext := oMem[1].ext
      time := oMem[1].time
      oMem.RemoveAt(1)
      
      ToolTip % "Message = "  . oMsg[msg]
            . "`nvkCode = " . vk
            . "`nscCode = " . sc
            . "`nTime = "   . time 
            . "`nPhysical = "   . (ext & 16 ? "Not" : "Yes")
            . "`n " q "   " ++w "   " oMem.MaxIndex() 
      Sleep 100
   }
   Return
}

Esc::ExitApp

lParam в функции — локальная переменная, она существует только до Return функции, и извлекать что-либо из неё по таймеру не имеет смысла.

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

81 (изменено: serzh82saratov, 2015-07-14 01:20:47)

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

извлекать что-либо из неё по таймеру не имеет смысла

Не до конца понимаю. lParam это просто число. Число заносится в массив как значение. Дошли до Return, lParam исчезла - это понятно. Но её значение в массиве куда исчезает? И почему wParam в массиве остаётся?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

82 (изменено: teadrinker, 2015-07-14 02:08:51)

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

Это не «просто число», это указатель на определённые данные в памяти, которые мы извлекаем. Данные по этому указателю валидны только на время выполнения функции, непосредственно в которую был послан указатель. Как только она выполнилась (дошла до Return), данные по этому адресу могут замещаться новой информацией (само значение указателя никуда не исчезает, можешь проверить). А вот wParam в данном случае — это как раз просто число.

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

83 (изменено: serzh82saratov, 2015-07-14 02:11:32)

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

определённые данные в памяти, которые мы извлекаем

Ок. Почему нельзя просто извлечь эти данные, и занести в массив, для последующей их обработки уже по таймеру?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

84

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

Почему нельзя? В моём коде как раз так и делается.

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

85

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

Это я понимаю. А как то "целиком" эти данные можно поместить в переменную?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

86

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

Можно прочитать участок памяти в статическую переменную, попозже напишу.

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

87 (изменено: teadrinker, 2015-07-14 02:40:54)

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

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

Exit:
   DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
   ExitApp
   
Esc::ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
    static oMem := [], q := 0, w := 0, lParamData
        , oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP", 0x104: "WM_SYSKEYDOWN", 0x105: "WM_SYSKEYUP"}
     
    VarSetCapacity(lParamData, Size := 16, 0)
    DllCall("RtlMoveMemory", Ptr, &lParamData, Ptr, lParam, Ptr, Size)
    
    oMem.Push([wParam, &lParamData]), ++q 
    SetTimer, EventHandling, -10   ; обработку событий "повесим" на таймер, чтобы не создавать помех в работе клавиатуры
    Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
 
EventHandling:  
    While (oMem[1] != "") 
    {  
        wp := oMem[1][1], lp := oMem[1][2] 
        oMem.RemoveAt(1) 
        
        msg := Format("{:#x}", wp)
        vk  := Format("{:#x}", NumGet(lp + 0, "UInt"))
        ext := NumGet(lp + 8, "UInt") 
        sc  := Format("{:#x}", NumGet(lp + 4, "UInt") | (ext & 1) << 8)
        time := NumGet(lp + 12, "UInt")
         
        ToolTip % "Message = "  . oMsg[msg]
                . "`nvkCode = " . vk
                . "`nscCode = " . sc
                . "`nTime = "   . time 
                . "`nPhysical = "   . (ext & 16 ? "Not" : "Yes")
                . "`n " q "   " ++w "   " oMem.MaxIndex() 
        Sleep 100
    } 
    Return
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

88

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

Спасибо! Вроде всё понятно.
Единственно что:

    VarSetCapacity(lParamData, Size := 16, 0)
    DllCall("RtlMoveMemory", Ptr, &lParamData, Ptr, lParam, Ptr, Size)

Если мы записали 16 байт в lParamData, занесли в массив адрес памяти, (при повторном вызове) не успев извлечь данные по этому адресу, очищаем её (VarSetCapacity) и снова пишем в неё данные. Что же тогда остаётся?

Если VarSetCapacity очищая lParamData, присваивает ей уже другой адрес, то как очищается память?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

89

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

Если мы записали 16 байт в lParamData, занесли в массив адрес памяти, (при повторном вызове) не успев извлечь данные по этому адресу, очищаем её (VarSetCapacity) и снова пишем в неё данные. Что же тогда остаётся?

Вопрос резонный, адрес тот же, соответственно, этот метод не годится.

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

90

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

этот метод не годится.

Ммм... Не понял, работает же.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

91

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

Просто каждый раз последние записанные данные используются.

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

92

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

Так, вроде, можно:

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

Exit:
   DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
   ExitApp
   
Esc::ExitApp

LowLevelKeyboardProc(nCode, wParam, lParam)
{
    static oMem := [], q := 0, w := 0, HEAP_ZERO_MEMORY := 0x8, hHeap := DllCall("GetProcessHeap", Ptr)
        , oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP", 0x104: "WM_SYSKEYDOWN", 0x105: "WM_SYSKEYUP"}
     
    pHeap := DllCall("HeapAlloc", Ptr, hHeap, UInt, HEAP_ZERO_MEMORY, Ptr, Size := 16, Ptr)
    DllCall("RtlMoveMemory", Ptr, pHeap, Ptr, lParam, Ptr, Size)
    
    oMem.Push([wParam, pHeap]), ++q 
    SetTimer, EventHandling, -10   ; обработку событий "повесим" на таймер, чтобы не создавать помех в работе клавиатуры
    Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
 
EventHandling:
    While (oMem[1] != "") 
    {  
        wp := oMem[1][1], lp := oMem[1][2]
        
        msg  := wp
        vk   := Format("{:#x}", NumGet(lp + 0, "UInt"))
        ext  := NumGet(lp + 8, "UInt") 
        sc   := Format("{:#x}", NumGet(lp + 4, "UInt") | (ext & 1) << 8)
        time := NumGet(lp + 12, "UInt")
        DllCall("HeapFree", Ptr, hHeap, UInt, 0, Ptr, lp)
        oMem.RemoveAt(1) 
         
        ToolTip % "Message = "  . oMsg[msg]
                . "`nvkCode = " . vk
                . "`nscCode = " . sc
                . "`nTime = "   . time 
                . "`nPhysical = "   . (ext & 16 ? "Not" : "Yes")
                . "`n " q "   " ++w "   " oMem.MaxIndex() 
        Sleep 100
    } 
    Return
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

93

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

Да, всё работает, спасибо за пример!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

94 (изменено: serzh82saratov, 2015-12-29 23:24:33)

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

В LowLevelKeyboardProc() возможно узнать физическим было нажатие, или нет.
А возможно ли это в LowLevelMouseProc()?

А, кажется нашёл.

NumGet(LParam + 12, "Short") & 16
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

95

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

Только почему 16? Нас только первый и единственный бит интересует, так что &1 достаточно.

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

96

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

Ок. Просто сделеал по аналогии с LowLevelKeyboardProc, там &1 мало.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

97

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

Что то у меня видимо с RegisterCallback нелады, не пойму почему при определении хук-процедуры как метода класса, идёт смещение параметров. В ToolTip видно что lParam теперь является не третьим а вторым.


Class.SetHook(1)
Return

Class Class { 
	HookProc(nCode, wParam, lParam) { 
		Critical
		
		ToolTip % Format("vk{:X}", NumGet(wParam + 0, "UInt")) "`n" Format("vk{:X}", NumGet(lParam + 0, "UInt"))
		
		Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "UInt", wParam, "UInt", lParam)
	}
	SetHook(On) {
		If On
			Class.hHook := DllCall("SetWindowsHookEx" . (A_IsUnicode ? "W" : "A")
					, "Int", 13   ;  WH_KEYBOARD_LL
					, "Ptr", RegisterCallback(Class.HookProc, "F")
					, "Ptr", DllCall("GetModuleHandle", "UInt", 0, "Ptr")
					, "UInt", 0, "Ptr")
		Else
			DllCall("UnhookWindowsHookEx", "Ptr", Class.hHook), Class.hHook := "" 
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

98

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

Если в данном примере использовать функцию, которая является методом класса, в неё по идее должен быть забинден параметр this, как в примере к статье SetTimer, но такой синтаксис RegisterCallback() не поддерживает.

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

99

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

То есть без вариантов.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.32.00 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

100

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

Ну, можно нырнуть в глубины winapi, и получить пойнтер на функцию через DllCall, но проще вывести за пределы класса.

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