1

Тема: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Здравствуйте, сабж в заголовке темы. На сколько я понял нужно найти флаг LLMHF_INJECTED. Но как это сделать? В соседних темах нашел  хук мыши, а что дальше делать не знаю.

#Persistent
   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)
}

2

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Смотрите тему по хукам в коллекции.

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

3 (изменено: teadrinker, 2017-07-02 23:35:25)

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Хотя нет, там, оказывается, об INJECTED не сказано.

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

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

LowLevelMouseProc(nCode, wParam, lParam)
{
   static msg, mouse_x, mouse_y, ext, time, injected
      , oMsg := { 0x200: "WM_MOUSEMOVE"
                , 0x201: "WM_LBUTTONDOWN", 0x202: "WM_LBUTTONUP"
                , 0x204: "WM_RBUTTONDOWN", 0x205: "WM_RBUTTONUP"
                , 0x207: "WM_MBUTTONDOWN", 0x208: "WM_MBUTTONUP"
                , 0x20B: "WM_XBUTTONDOWN", 0x20C: "WM_XBUTTONUP"
                , 0x20A: "WM_MOUSEWHEEL" , 0x20E: "WM_MOUSEHWHEEL" }
                
      , oMouseData := { 0: "0", 1: "XBUTTON1", 2: "XBUTTON2"
                      , 120: "WHEEL_DELTA forward", -120: "WHEEL_DELTA backward" }

   msg := wParam
   mouse_x := NumGet(lParam + 0, "Int")
   mouse_y := NumGet(lParam + 4, "Int")
   ext     := NumGet(lParam + 10, "Short")
   injected:= NumGet(lParam + 12, "Char") & 1
   time    := NumGet(lParam + 16, "UInt")
   
   SetTimer, EventHandling, -10
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   ToolTip, % "Message = "     . oMsg[msg]
            . "`nMouse_X = "   . mouse_x
            . "`nMouse_Y = "   . mouse_y
            . "`nMouseData = " . oMouseData[ext]
            . "`ninjected = "  . injected
            . "`nTime = "      . time
   Return
}

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

4

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

teadrinker
Почему-то значение пустое всегда. Вне зависимости от того эмуляция или машинный ввод, почему может быть такое?

5

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

А, там ошибка. Замените в

static msg, mouse_x, mouse_y, ext, time, inject

inject на injected.

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

6

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

teadrinker
Спасибо! Теперь все работает. Только не понятно почему при SendMode Play хук не видит эмуляцию?

7

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Наверно, поэтому:

Of the three sending modes, SendPlay is the most unusual because it does not simulate keystrokes and mouse clicks per se. Instead, it creates a series of events (messages) that flow directly to the active window (similar to ControlSend, but at a lower level).

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

8

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

teadrinker
Это возможно как-то отследить?

9

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Не знаю, не интересовался.

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

10

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Подскажите пожалуйста, как узнать значение флага LLMHF_LOWER_IL_INJECTED.

11 (изменено: teadrinker, 2017-07-03 03:25:41)

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

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

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

LowLevelMouseProc(nCode, wParam, lParam)
{
   static msg, mouse_x, mouse_y, ext, time, injected, LOWER_IL_INJECTED
      , oMsg := { 0x200: "WM_MOUSEMOVE"
                , 0x201: "WM_LBUTTONDOWN", 0x202: "WM_LBUTTONUP"
                , 0x204: "WM_RBUTTONDOWN", 0x205: "WM_RBUTTONUP"
                , 0x207: "WM_MBUTTONDOWN", 0x208: "WM_MBUTTONUP"
                , 0x20B: "WM_XBUTTONDOWN", 0x20C: "WM_XBUTTONUP"
                , 0x20A: "WM_MOUSEWHEEL" , 0x20E: "WM_MOUSEHWHEEL" }
                
      , oMouseData := { 0: "0", 1: "XBUTTON1", 2: "XBUTTON2"
                      , 120: "WHEEL_DELTA forward", -120: "WHEEL_DELTA backward" }

   msg := wParam
   mouse_x := NumGet(lParam + 0, "Int")
   mouse_y := NumGet(lParam + 4, "Int")
   ext     := NumGet(lParam + 10, "Short")
   injected:= NumGet(lParam + 12, "Char") & 1
   LOWER_IL_INJECTED := NumGet(lParam + 12, "Char") >> 1
   time    := NumGet(lParam + 16, "UInt")
   
   SetTimer, EventHandling, -10
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

EventHandling:
   ToolTip, % "Message = "     . oMsg[msg]
            . "`nMouse_X = "   . mouse_x
            . "`nMouse_Y = "   . mouse_y
            . "`nMouseData = " . oMouseData[ext]
            . "`ninjected = "  . injected
            . "`nLOWER_IL_INJECTED = " . LOWER_IL_INJECTED
            . "`nTime = "      . time
   Return
}

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

12

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

teadrinker
Спасибо все работает. И все равно SendMode Play остается незаметным.

Чуть не в тему. Можно ли данную строку воспроизвести с помощью MouseMove или чего-то из инструментария AutoHotKey?

DllCall("mouse_event",uint,1,int,x,int,y,uint,0,int,0)

13

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

MouseMove есть опция Relative.

powercat пишет:

И все равно SendMode Play остается незаметным.

HID тоже пропускает такое событие.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

14

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Можно проверять A_TimeIdlePhysical с установленным мышиным хуком.

15

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Проверять то можно, но когда? Если мы не можем знать, что событие произошло.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

16

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Проверять при смене положения курсора.

17

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Так оно и на смену положения не реагирует. Предлагаешь проверять циклом координаты?

SendPlay {Click 100, 200, 0}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

18

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Ну да. Через MouseGetPos.

19

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Тогда и хук и как бы не нужен.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

20

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

И даже с нулевым интервалом синхронизация будет так себе.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

21

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

Почему хук не нужен?
Для A_TimeIdlePhysical нужен #InstallMouseHook.
Насчет синхронизации не понял.

22

Re: AHK: Распознавание машинного ввода и эмуляции нажатия кнопки мыши.

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).