1

Тема: AHK: Получить код нажатой клавиши в переменную.

Здравствуйте. Есть функция input которая пишет в переменную символ клавиши. Есть функция GetKeyState которая пишет состояние клавиши. а вот есть ли что-то, ну или скрипт чтобы записывать в переменную виртуальный код клавиши? Зачем это надо?
1. есть окно в котором выполняются разные действия в зависимости от нажатой клавиши.
2. Из переменной функции input значение сравнивается с шаблоном. Например если нажато l, то кликнуть в одном месте, если нажато f, кликнуть в другом месте. И вот тут наступает как говорится самый интересный зверек. у пользователей как правило две раскладки, русская, и английская. И чтобы все это заработало, надо каждый раз переключать раскладку  в нужном окне. поэтому проще сравнивать код клавиши с шаблоном, чем создавать скрипт под несколько раскладок. Смену языка не предлагать у всех разные ос, и работает не везде, ну или не так как надо.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

2

Re: AHK: Получить код нажатой клавиши в переменную.

Не совсем понятно о чем идёт речь. Но есть универсальные коды клавиш, которые работают на всех раскладках. https://api.farmanager.com/ru/winapi/vi … codes.html.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: Получить код нажатой клавиши в переменную.


vk4C::MouseMove,0,0,0 ;l
vk46::MouseMove,500,500,0 ;f

4

Re: AHK: Получить код нажатой клавиши в переменную.

AHK: Установка хуков на события мыши и клавиатуры

5

Re: AHK: Получить код нажатой клавиши в переменную.

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

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

6

Re: AHK: Получить код нажатой клавиши в переменную.

Отжатия клавиш записывать? Если зажали ctrl, нажали несколько клавиш, отжали ctrl, как должно выглядеть содержимое переменной?

7

Re: AHK: Получить код нажатой клавиши в переменную.

stealzy Переменная должна выглядеть так. VK_f1, или hex значение. у F1 это 70. При нажатии клавиши должно записаться одно из этих значений в переменную.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

8

Re: AHK: Получить код нажатой клавиши в переменную.

Ну или еще вариант может кто знает, можно конвертировать значение переменной из функции input. тогда не важно какая раскладка, будит в переменной например f, а сконвертировать ее в  hex значение 46. Будит на русской раскладке нажато А , и все равно  будит 46. Проще говоря надо в независимости от раскладки записывать в переменную универсальное значение клавиши.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

9

Re: AHK: Получить код нажатой клавиши в переменную.

Как-то вот так.

Input, SingleKey, L1 m,
name := GetKeyName(SingleKey)
vk   := GetKeyVK(SingleKey)
sc   := GetKeySC(SingleKey)
MsgBox, % Format("Name:`t{}`nVK:`t{:X}`nSC:`t{:X}", name, vk, sc)
exitapp 
win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

10

Re: AHK: Получить код нажатой клавиши в переменную.

Уж не знаю, кто кого будит в день независимости, но видимо отжатия клавиш вам не нужны. Меня как-то интересовало, как получить последовательный список всех нажатий и отжатий клавиш в переменную, но ничего лучше установки прозрачного хоткея на каждую не придумалось. При установке хука в стандартном трей-меню скрипта можно открыть окошко, где этот список отображается, но вот изнутри получить это содержимое никак нельзя.
Кстати, что функции возращают на "CtrlC" (при L1 m опции)?

11 (изменено: ypppu, 2017-09-27 18:09:11)

Re: AHK: Получить код нажатой клавиши в переменную.

stealzy l1 это ограничение количества символов типа только 1. M - это обработка клавиш которые ничего не возвращают типа ctrl alt и т.д. А насчет списка всех клавиш, наверное  смотрите в сторону keyhistory.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

12

Re: AHK: Получить код нажатой клавиши в переменную.

Viruzober пишет:

А хуки это не то.

А почему не то?

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

13

Re: AHK: Получить код нажатой клавиши в переменную.

Ага, Keyhistory как раз то gui окошко, а получить к его содержимому доступ изнутри метода вроде нет, ну да ладно.

14

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker, можешь показать, как хуком получить строку вида: {vk1 down}{vk43 down}{vk43 up}{vk1 up}?

15

Re: AHK: Получить код нажатой клавиши в переменную.

stealzy пишет:

как хуком получить строку вида: {vk1 down}{vk43 down}{vk43 up}{vk1 up}

Первый же код в теме, на которую я дал ссылку.

16

Re: AHK: Получить код нажатой клавиши в переменную.

Спасибо, обязательно попробую, как будет возможность.
Кстати, при использовании хуков иногда возникали фризы пользовательского ввода до 5 секунд, если в последних версиях не исправили. Интересно, с чем это связано, при #InstllKbdHook такого эффекта нет.

17 (изменено: teadrinker, 2017-07-23 14:35:16)

Re: AHK: Получить код нажатой клавиши в переменную.

Там код устарел немного, лучше так:

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"}

   while (oMem[1] != "")   {
      key := oMem.RemoveAt(1)
      wp := key[1], lp := key[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")

      ToolTip % "Message = "   . oMsg[msg] . "`n"
              . "vkCode = "    . vk        . "`n"
              . "scCode = "    . sc        . "`n"
              . "Time = "      . time      . "`n"
              . "Physical = "  . (ext & 16 ? "Not" : "Yes")
   } 
}

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

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

18

Re: AHK: Получить код нажатой клавиши в переменную.

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

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

19

Re: AHK: Получить код нажатой клавиши в переменную.

Не понял вас. Скрипт запускали, который я только что привёл?

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

20 (изменено: serzh82saratov, 2017-07-23 13:33:26)

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker пишет:

Там код устарел немного, лучше так:

Сейчас без UnhookWindowsHookEx, что ещё нового?
АП. Ты наверное про RtlMoveMemory, чтобы не пропускать нажатия...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker Я тоже не понял хуки то мне не нужны. Вы спрашивали почему хуки это не то. или я что-то пропустил.  Не имею возможности полноценно читать форум. А можно пример сравнения переменных в if? Я не нашел в русском руководстве что-то.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

22 (изменено: teadrinker, 2017-07-23 13:36:54)

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov пишет:

что ещё нового?

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

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

23 (изменено: serzh82saratov, 2017-07-23 13:42:08)

Re: AHK: Получить код нажатой клавиши в переменную.

oMsg - может проще заменить на флаг LLKHF_UP, какая нам разница WM_SYSKEYDOWN или WM_KEYDOWN?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker пишет:

UnhookWindowsHookEx не обязательно

Нет, не прав, только что перечитал, обязательно, исправлю.

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

25

Re: AHK: Получить код нажатой клавиши в переменную.

Viruzober пишет:

teadrinker Я тоже не понял хуки то мне не нужны. Вы спрашивали почему хуки это не то. или я что-то пропустил.  Не имею возможности полноценно читать форум. А можно пример сравнения переменных в if? Я не нашел в русском руководстве что-то.

Все нашел. Да тут все правильно работает, но мне нужно было получать код клавиши в переменную для последующего сравнения к тому-же как мне кажется тот пример который я привел проще.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

26

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov пишет:

какая нам разница WM_SYSKEYDOWN или WM_KEYDOWN?

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

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

27

Re: AHK: Получить код нажатой клавиши в переменную.

Ок, тогда и флаг LLKHF_UP в пример добавить. Просто в большинстве случаев удобнее пользоватся им, и wParam не сохранять.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker В любом случае спасибо, и это пригодится. Просто мне в такое количество кода вникать пока туго. Большинство не понимаю.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

29

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov пишет:

Ок, тогда и флаг LLKHF_UP в пример добавить.

Согласен, попозже перепишу в коллекции.

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

30

Re: AHK: Получить код нажатой клавиши в переменную.

Viruzober пишет:

мне кажется тот пример который я привел проще.

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

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

31

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker Мне только для символов и надо было. А там вроде в input можно как-то для прочих клавиш сделать транскрипцию. Вроде как-то так в руководстве было.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

32 (изменено: serzh82saratov, 2017-07-23 14:55:24)

Re: AHK: Получить код нажатой клавиши в переменную.

Тогда проще наверное хоткеями:


Visible := 0   ;	пропускать ввод в систему

vkhks = 30|31|32|33|34|35|36|37|38|39|41|42|43|44|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|53|54|55|56|57|58|59|5A|5B|5C|60|61|62|63|64|65|66|67|68|69|6A|6B|6D|6E|6F|A0|A1|A2|A3|A4|A5|BA|BB|BC|BD|BE|BF|C0|DB|DC|DD|DE|E2
V := Visible ? "~" : ""
Loop, Parse, vkhks, |
{
	Hotkey, % V "*vk" A_LoopField, Hotkey
	Hotkey, % V "*vk" A_LoopField " Up", Hotkey
}
	
Hotkey:
	ToolTip % RegExReplace(A_ThisHotkey, "[~\*]")
	Return

Получить нужные коды не сложно, также как и все.


Loop % 0xFF
{
	vk := Format("{:X}", A_Index) 
	Name := GetKeyName("vk" vk)
	If StrLen(Name) = 1 || Name ~= "Numpad(\d|Dot|Div|Mult|Sub|Add)" || Name ~= "i)(l|r)(control|alt|shift|win)"
		Str .= vk "|"
} 
MsgBox, , % i, % Clipboard := Str
ExitApp 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: Получить код нажатой клавиши в переменную.

stealzy пишет:

получить строку вида: {vk1 down}{vk43 down}{vk43 up}{vk1 up}?

Visible := 0   ;	пропускать ввод в систему

vkhks = 3|4|5|6|8|9|C|D|10|11|12|13|14|1B|20|21|22|23|24|25|26|27|28|2C|2D|2E|2F|30|31|32|33|34|35|36|37|38|39|41|42|43|44|45|46|47|48|49|4A|4B|4C|4D|4E|4F|50|51|52|53|54|55|56|57|58|59|5A|5B|5C|5D|5F|60|61|62|63|64|65|66|67|68|69|6A|6B|6D|6E|6F|70|71|72|73|74|75|76|77|78|79|7A|7B|7C|7D|7E|7F|80|81|82|83|84|85|86|87|90|91|9C|9D|9E|9F|A0|A1|A2|A3|A4|A5|A6|A7|A8|A9|AA|AB|AC|AD|AE|AF|B0|B1|B2|B3|B4|B5|B6|B7|BA|BB|BC|BD|BE|BF|C0|DB|DC|DD|DE|E2

V := Visible ? "~" : ""
Loop, Parse, vkhks, |
{
	Hotkey, % V "*vk" A_LoopField, Hotkey
	Hotkey, % V "*vk" A_LoopField " Up", Hotkey
}
Return

Hotkey:
	ks .= "{" RegExReplace(A_ThisHotkey, "[~\*]") (InStr(A_ThisHotkey, " Up") ? "" : " Down") "}"
	ToolTip % ks
	Return

Escape:: ExitApp
Loop % 0xFF
{
	vk := Format("{:X}", A_Index) 
	If GetKeyName("vk" vk) != ""
		Str .= vk "|"
} 
MsgBox, , % i, % Clipboard := Str
ExitApp 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

34

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov А все-таки возможно ли с моим примером обрабатывать клавиши типа ctrl alt shift и т. д. попытался что-то не получилось.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

35

Re: AHK: Получить код нажатой клавиши в переменную.

teadrinker
Точнее не LLKHF_UP а Ext >> 7.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

36 (изменено: ypppu, 2017-09-27 18:09:51)

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov Простите, для чайника поясните? Куда именно добавить? В input?

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

37 (изменено: serzh82saratov, 2017-07-23 14:52:29)

Re: AHK: Получить код нажатой клавиши в переменную.

Viruzober пишет:

возможно ли с моим примером обрабатывать клавиши типа ctrl alt shift

Я с начала не заметил что "с моим примером", 32 пост поправил чтобы можно было.

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

38 (изменено: ypppu, 2017-09-27 18:10:07)

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov Пример то я видел, но там сказано что  клавиши из списка не пишутся в переменную.
.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

39 (изменено: stealzy, 2017-07-23 15:03:33)

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov

stealzy пишет:

ничего лучше установки прозрачного хоткея на каждую не придумалось

Если хоткеи не нужны можно и так.

40

Re: AHK: Получить код нажатой клавиши в переменную.

Viruzober
Но там же написано куда пишется:


Loop
{
	Input, SingleKey, L1, {LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}
	If InStr(ErrorLevel, "EndKey:")
		ToolTip % SubStr(ErrorLevel, 8)
	Else
		ToolTip % SingleKey
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

41

Re: AHK: Получить код нажатой клавиши в переменную.

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

42

Re: AHK: Получить код нажатой клавиши в переменную.

Кстати нет, не замечал раньше это.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

43

Re: AHK: Получить код нажатой клавиши в переменную.

stealzy Я даже больше скажу, при хуках клавиатура совсем мертвая в плане enter shift ctrl и т.д. Как бы записать в переменную чтобы так сказать и рыбку скушать , и клавиши использовать все?

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.

44

Re: AHK: Получить код нажатой клавиши в переменную.

Viruzober, проставьте заглавные буквы и точки в своих сообщениях.
http://forum.script-coding.com/viewtopi … 01#p117501
http://forum.script-coding.com/viewtopi … 30#p117530
http://forum.script-coding.com/viewtopi … 32#p117532

45

Re: AHK: Получить код нажатой клавиши в переменную.

serzh82saratov
https://autohotkey.com/boards/viewtopic … mp;t=31746

46

Re: AHK: Получить код нажатой клавиши в переменную.

Еще один вопрос. А как записать в переменную клавиши с модификаторами? с хуками понял, с input тоже. А например как записать , и перехватить  в ctrlF? В общем нужно прикрутить ctrl, alt, shift. как я понял это только через хуки. Пните пожалуйста в нужную сторону.

win 10.0.14393 Build 14393 x64, AutoHotkey 1.1.26.01.