1

Тема: AHK: Установка хуков на определенные клавиши, и запись их в переменную

Как переделать чтобы скрипт устанавливал хук только на определенные клавиши, указанные в переменной, и записывал их в переменную? Например, в первой переменной пишем Ctrl+f, или f3, или G, или Ctrl+alt+e, и при т.д. И при при нажатии любой из них, клавиша пишется в таком же виде в другую переменную. Срабатывание скрипта предполагается в определенном окне.

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

Esc::ExitApp

Exit(hHookKeybd)  {
   DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
}

LowLevelKeyboardProc(nCode, wParam, lParam)  {
   static oMem := [], lpData, size := VarSetCapacity(lpData, 16, 0)

   DllCall("RtlMoveMemory", Ptr, &lpData, Ptr, lParam, Ptr, size)
   oMem.Push([wParam, &lpData])
   timer := Func("EventHandling").Bind(oMem)  ; во избежание фризов клавиатуры обработка событий должна
   SetTimer, % timer, -10                     ; происходить обязательно по таймеру, а не в теле этой функции
   Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
}

EventHandling(oMem)  {
   static oMsg := {0x100: "WM_KEYDOWN", 0x101: "WM_KEYUP", 0x104: "WM_SYSKEYDOWN", 0x105: "WM_SYSKEYUP"}
        , oMembers := ["vk", "sc", "flags", "time"]
        , oFlagOffsets := {LLKHF_EXTENDED: 0, LLKHF_LOWER_IL_INJECTED: 1, LLKHF_INJECTED: 4, LLKHF_ALTDOWN: 5, LLKHF_UP: 7}

   while (oMem[1] != "")   {
      key := oMem.RemoveAt(1)
      wp := key[1], lp := key[2]

      msg := wp
      for k, v in oMembers
         %v% := NumGet(lp + (k - 1)*4, "UInt")
      
      for k, v in oFlagOffsets
         %k% := (flags >> v) & 1
      
      sc |= LLKHF_EXTENDED << 8
      
; текстовые значения в oMembers и названия ключей в oFlagOffsets являются
; названиями переменных, в которых теперь находятся соответствующие значения:
      ToolTip % "Message = "   . oMsg[msg]           . "`n"
              . "vkCode = "    . Format("{:#x}", vk) . "`n"
              . "scCode = "    . Format("{:#x}", sc) . "`n"
              . "pressed = "   . !LLKHF_UP           . "`n"
              . "Time = "      . time                . "`n"
              . "Injected = "  . LLKHF_INJECTED      . "`n"
              . "Lower_IL_Injected = " . LLKHF_LOWER_IL_INJECTED, 0, 0
   } 
}
win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

2

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

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

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

3 (изменено: Viruzober, 2017-09-29 09:33:36)

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

teadrinker Входные клавиши, например так ctrl+f, или g, или f1, или ctrl+shift+p. Думаю принцип понятен. А выходные, так же, но в другую переменную.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

4

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

Viruzober, расставьте точки и заглавные буквы.
http://forum.script-coding.com/viewtopi … 94#p117594
http://forum.script-coding.com/viewtopi … 02#p119602

5

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

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

#SingleInstance, Force

Global aCommand_Title := "Открыть блокнот"



Gui, Font, cFFFFFF s10 bold, Arial
Gui, Add, Text, x10  y25 w70 h20, Клавиша
Gui, Add, Text, x105 y25 w280 h20, Что делает


	Gui, Add, Hotkey, x5   y25 w90  h20 vHot1, % 1
	Gui, Add, Edit,   x105 y25 w440 h20 vWhatToDo1, % aCommand_Title
	GuiControl, Disable, WhatToDo1


Gui, Add, Button, x256 y390 w80 h20 gAccept, Применить
Gui, Show, h420 w624 Center, AutoHotKey
Return



F5::Reload

Accept:
	Hotkey, % Hot1, Off, UseErrorLevel
	HotKey("Off")

	GuiControlGet, Hot1
	aHotkey1 := Hot1
	Hotkey, % Hot1, HotKeyy, On, UseErrorLevel
	HotKey("On")
return

HotKeyy:
	If(A_ThisHotkey = aHotkey1)
		HotKey(1)
Return


HotKey(aIndex)
{
	If(aIndex = 1) ;Открыть блокнот
		Run, calc.exe
}


GuiClose:
ExitApp

6

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

MandarinKa02 Спасибо огромное, но маленько не то. Задача следующая.
Есть программа, которой необходимо управлять при помощи скрипта.
То есть кликать мышкой в нужных местах. При этом, должно происходить отслеживание нажатых клавиш и их комбинаций. Далее все что нажато пользователем записывается в переменную, и в зависимости от того что записано выполняется определенное действие. Скрипт при этом должен работать постоянно, и не пошагово, а реагировать на любую прописанную в нем клавишу, в любом месте. И звените, все понял в AHK, но вот как с клавишами быть не пойму.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

7

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

Убрал тему-дубликат, перенёс ответы сюда.
Viruzober,

Правила пишет:

2.5. Запрещается флуд. Размещение нескольких однотипных постов или тем (веток) приравнивается ко флуду.

8 (изменено: svoboden, 2017-09-30 14:29:35)

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

А что, нельзя просто использовать GetKeyState или хоткеи?
Например:

^!vk45::
var = Ctrl+Alt+E
MsgBox % var
return

9

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

svoboden OutputVar
Имя переменной, куда будет помещено состояние клавиши: для нажатой в переменную будет записана буква D, для отпущенной - U (однако функция GetKeyState() возвращает 1 для нажатой и 0 для отпущенной). Переменная будет пустой, если состояние клавиши получить не удалось. Проблема в том, что клавиш может быть много, и на каждую делать GetKeyState тяжело. При этом клавиши должны срабатывать в любое время, то есть нужна первое действие, нажимаем одно, нужно второе, нажимаем другое. А здесь я как понимаю скрипт выполняется по шагам. Поэтому лучше использовать хуки. А вот как их переделать? Попытаюсь объяснить. В программе для которой пишется скрипт, есть несколько кнопок, на которые нужно нажимать в абсолютно разном порядке, поэтому надо отследить что нажимает пользователь, а потом нажатую клавишу сопоставить с действием. Поэтому пошаговости не получится.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

10 (изменено: svoboden, 2017-09-30 21:11:44)

Re: AHK: Установка хуков на определенные клавиши, и запись их в переменную

Viruzober, так поставьте в своем хуке исключение на определенные клавиши.