Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Помощь в написании скриптов
csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 23 Nov 2022, 21:17

Существуют клавиатуры с доп "программируемыми" клавишами (речь НЕ о мультимедиа клавишах), которые биндятся в особых программах под клавиатуру. (картинка 1). Хочу получить код клавиши напрямую, без косвенных двойных переназначений в оригинальной программе для клавиатуры.

Нашла внизу статьи https://ahk-wiki.ru/keylist инструкцию как получить код через #InstallKeybdHook. Но не получилось. (картинка 2)
Вероятно, как написано в той же инструкции, ahk эти клавиши не распознает, т.к. они на "слишком низком уровне". Цитата с сайта:
если после нажатия искомой клавиши никаких записей в логе не появилось, значит такая клавиша не распознаётся данной программой. В этом случае вы не можете использовать данную клавишу как горячую, т.к. либо драйвер вашей клавиатуры, либо сама её "железная" составляющая даёт сигнал слишком низкого уровня, недоступного для AutoHotkey. В случае со "злобными" драйверами, вы можете попробовать либо перенастроить сами "родные" драйвера, либо заменить их на другие, более дружественые, например такие, как дефолтные клавиатурные драйвера Windows.
Какие способы есть достать коды этих клавиш? Мучиться с драйверами? Мудрить с кейлоггерами как-то?
Может есть еще какие-нибудь скрипты по диагностике оборудования, по типу AutoHotInterception -> Monitor.ahk? (в нём клавиатура определяется, но конкретные клавиши никак не узнать)

Если что, название моей клавиатуры - A4Tech X7-G800V. Также программируемые клавиши есть на Razer Anansi, на A4Tech Bloody B314...

При том что в проге от производителя клавиши биндятся нормально(картинка 3), они рабочие. Хочется уметь биндить их в AHK, для более гибкой настройки.
Attachments
123.jpg
123.jpg (91.74 KiB) Viewed 2395 times
124.jpg
124.jpg (90.53 KiB) Viewed 2395 times
125.jpg
125.jpg (84.51 KiB) Viewed 2395 times

vmech
Posts: 353
Joined: 25 Aug 2019, 13:03

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by vmech » 24 Nov 2022, 02:03

@csharperHH
1. А в играх распознаются эти клавиши ? Особенно те, на которые в программе Oscar не назначены никакие действия ?
2. Кнопки на скриншоте 3 (G1-G10) с назначенными действиями распознаются в AutoHotkey с назначенными значениями (в конкретном случае со скриншотом 3 - как кнопки мыши) ?


Пожалуй, зря я это всё написал. Ваша клавиатура - это Oscar-устройство. Значения назначенных кнопок эмулируются прямо в самой клавиатуре. Программа Oscar всего лишь отсылает процессору клавиатуры скомпилированный макрос, а клавиатура отдаёт в компьютер уже серию сканкодов, прописанных в макросе.

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

ЗЫ. У меня есть мышь X7 Oscar, на ней есть кнопка 3X-Fire, по умолчанию ей установлен макрос тройного левого клика, с задержкой около 64 мсек между нажатиями. Я заменил этот макрос на двойной левый клик (так удобнее). Все программы, и сама ОС Windows, видят эту кнопку как серию левых кликов. И никак либо иначе. Без назначения каких либо действий на эту кнопку она вообще нигде и никак не отображается (словно её вообще нет на мышке).
Please post your script code inside [code] ... [/code] block. Thank you.

Guest

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by Guest » 24 Nov 2022, 08:15

@vmech, можно ли как-то из AHK (вместо oscar) "подменить" эти макросы? При получении сигнала нажатия клавиши - ловить его сразу в ahk.

Guest

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by Guest » 24 Nov 2022, 08:17

Распишу подробнее что получилось в диагностике #InstallKeybdHook
Когда клавиша забинжена в Oscar - то она работает нормально и в играх и везде.
1. А в играх распознаются эти клавиши ? Особенно те, на которые в программе Oscar не назначены никакие действия ?
- Нет, никак не видятся если им не поставлено поведение.
2. Кнопки на скриншоте 3 (G1-G10) с назначенными действиями распознаются в AutoHotkey с назначенными значениями
Только назначенные значения. Хотелось бы получить "сырые" изначальные коды физических клавиш (напр код именно g13, а не код клавиши "End", на которую её бинжу)

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 24 Nov 2022, 08:20

Распишу подробнее что получилось в диагностике #InstallKeybdHook
image.png
image.png (406.32 KiB) Viewed 2334 times
Когда клавиша забинжена в Oscar - то она работает нормально и в играх и везде.
1. А в играх распознаются эти клавиши ? Особенно те, на которые в программе Oscar не назначены никакие действия ?
- Нет, никак не видятся если им не поставлено поведение.
2. Кнопки на скриншоте 3 (G1-G10) с назначенными действиями распознаются в AutoHotkey с назначенными значениями
Только назначенные значения. Хотелось бы получить "сырые" изначальные коды физических клавиш (напр код именно g13, а не код клавиши "End", на которую её бинжу)

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 24 Nov 2022, 08:26

Планирую сделать из клавиш g5-g10 "модификаторы" (чтобы работали также как win, alt, ctrl). Типа новый слой комбинаций клавиш. Я пишу код, использую разные программы, пользуюсь hotstrings - горячих нужно желаю много, и таких чтобы удобно было нажимать.

Это проще делать в AHK, чем макросами в Oscar. К тому же, в Oscar какие-то баги - картинка 1 (при открытии окна макросов, и при сохранении в файл). Но все же попробую, спасибо за наводку.

Физически клавиши ведь есть, должен быть и способ их "поймать" вне Oscar. Хотя бы и на низком уровне, типа колдовством с драйверами.
баг.png
баг.png (199.52 KiB) Viewed 2339 times

vmech
Posts: 353
Joined: 25 Aug 2019, 13:03

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by vmech » 24 Nov 2022, 08:52

csharperHH wrote:
24 Nov 2022, 08:26
Физически клавиши ведь есть, должен быть и способ их "поймать" вне Oscar. Хотя бы и на низком уровне, типа колдовством с драйверами.
Похоже, Вы просто не в курсе всей этой клавиатурной «кухни». У этих кнопок просто нет собственных, выделенных только им, сканкодов. Потому что их предназначение в другом - расширять возможности клавиатуры с помощью встроенного в клавиатуру процессора.

ЗЫ. Найдите в интернете какую нть статью/книгу об аппаратном устройстве IBM PC (вроде «IBM PC для пользователя» за авторством Фигурнова). Там весьма подробно изложено каким именно образом ПК и множество его клавиатур общаются друг с другом. На крайняк пошерстите википедию, там тоже что то встречалось по теме.

ЗЫЫ.
csharperHH wrote:
24 Nov 2022, 08:20
Только назначенные значения. Хотелось бы получить "сырые" изначальные коды физических клавиш (напр код именно g13, а не код клавиши "End", на которую её бинжу)
Как я уже отметил выше, у кнопок G1-G16 нет собственных сканкодов. Поэтому «поймать» их не удастся (потому что ловить то и нечего :D ).
Please post your script code inside [code] ... [/code] block. Thank you.

mcl
Posts: 355
Joined: 04 May 2018, 16:35

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by mcl » 25 Nov 2022, 12:21

Чисто гипотетически: можно попробовать через Oscar навесить на эти клавиши несуществующие (на обычной клавиатуре) F13−F24, а уже эти клавиши отлавливать в AHK.
github://oGDIp - GDI+ wrapper for AHK v1.1

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 28 Nov 2022, 12:00

mcl wrote:
25 Nov 2022, 12:21
Чисто гипотетически: можно попробовать через Oscar навесить на эти клавиши несуществующие (на обычной клавиатуре) F13−F24, а уже эти клавиши отлавливать в AHK.
Идея интересная, но к сожалению не вышло. Вручную в макросах проверял коды клавиш - никаких скрытых не нашёл.

Вкратце, ничего такого, что нельзя было бы забиндить в Oscar Ui я в кодах не нашёл.

Если кто-то будет мучаться, то вот некоторые "внутренние" коды клавиш оскар для работы при написании макроса. Для просмотра этих кодов, нужно открыть файл макроса в текстовом редакторе.
Ориентировочно: первые 55 - обычные клавиши.
58-69 = верхняя панель F1-12,
90е коды = панель Num.
Около сотых - некоторые медиа клавиши.
Потом до 270 много кодов RESERVED. Т.е. пустых.

Code: Select all

` = 53
tab = 43

f1 = KeyUp 58 1
f4 = KeyDown 61 1 // при этом  VK/SC = 73-03E
f5 = KeyDown 62 1
	6-63 7-64 8-65 9-66 10-67 11-68
f12 = KeyUp 69 1
91 = num2 или num3 примерно
101 = Menu = app, не нужно, она занята!
102 = Power
119 = Select
120 = STOP
121 = AGAIN
122	UNDO
	CUT
	COPY
	PASTE
	FIND
	MUTE
128 Volume_Up
129 =	Volume_Down
до 260 ничего, а если ставить код 300 - то вообще баг
264 = ctrl
266 = Alt
267 = Win
Может быть, назначу на "Клавиши расширенных функций Мультимедийных и Интернет-клавиатур". Вроде, их Oscar позволяет вбить, и их видит AHK.

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 28 Nov 2022, 12:08

Вероятно, для решение проблемы подойдёт AHKHID. Но я не смог разобраться.

Через скрипт example_1.ahk отсюда (https://www.autohotkey.com/board/topic/38015-ahkhid-an-ahk-implementation-of-the-hid-functions/) получаю код моей клавиатуры (в списке их 2).
111.png
111.png (35.48 KiB) Viewed 2231 times
Для проверка вставляю код клавиатур в такой скрипт: http://forum.script-coding.com/viewtopic.php?pid=83102#p83102

Code: Select all

Gui +LastFound -Resize -MaximizeBox -MinimizeBox
Gui, Add, Text, x0 y0 w400 h300 vt1 , none
GuiHandle := WinExist()

#include AHKHID.ahk
; plug constants AHKHID
AHKHID_UseConstants()

; Upon receipt of the message, start the function InputMsg
WM_INPUT := 0x00FF
OnMessage(WM_INPUT, "InputMsg")

; RIDEV_INPUTSINK - To accept messages in the background
keydoard := AHKHID_Register(1, 2, GuiHandle, RIDEV_INPUTSINK )

Return 

;-----------------------------------------
; Processing an incoming message

InputMsg(wParam, lParam) {
    Local DevHandle, VKey, sLabel, ProdName 
    
    Critical    ;Or otherwise you could get ERROR_INVALID_HANDLE
    
    ;get II_DEVHANDLE
    DevHandle := AHKHID_GetInputInfo(lParam, II_DEVHANDLE) 
    
    ProdName = % AHKHID_GetDevName(DevHandle, True) ;имя устройства    
    
    /* из example_1.ahk
        my_264_Keys \\?\HID#VID_04D9&PID_FC41&MI_01#9&406d4c2&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
        my_173_Keys \\?\HID#VID_09DA&PID_90C0&MI_00&Col01#8&23ae9689&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
        если имя устройства как у моей клавиатуры
    */
    if ProdName = \\?\HID#VID_04D9&PID_FC41&MI_01#9&406d4c2&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
    {
        ToolTip, my_264_Keys ;not work
    }
    if ProdName = \\?\HID#VID_09DA&PID_90C0&MI_00&Col01#8&23ae9689&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}
    {
        ToolTip, my_173_Keys ;not work
    }

	;obviously, not work because it is not my keyboard, but logic for example
    if ProdName = \\?\HID#VID_0518&PID_0001&MI_01&Col01#8&3125ebc9&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
    {
        
        ; We get the button key
        VKey = % AHKHID_GetInputInfo(lParam, II_KBD_VKEY)

        ; We get the name of the procedure of this button
        sLabel := "Key_" VKey
        
        ; If there is such a procedure, we call it
        If IsLabel(sLabel)
            Gosub, %sLabel%
            
    }
}

Sound() {
    SoundPlay, %A_WinDir%\Media\ding.wav
}

;------------------------------------------------------------- appoint keys
;keyboard scroll up
Key_120:
    SoundSet +5
    Send, {WheelDown}
    Sound()
Return

;keyboard scroll down
Key_65416:
    SoundSet -5
    Send, {WheelUp}
    Sound()
Return
Но непонятно где взять коды клавиш, и почему не ловится мой ProdName клавиатуры. Скрипт на неё не реагирует.

vmech
Posts: 353
Joined: 25 Aug 2019, 13:03

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by vmech » 28 Nov 2022, 15:59

Но непонятно где взять коды клавиш
В гугле не пробовал ?
https://api.farmanager.com/ru/winapi/virtualkeycodes.html

Вот ещё:
вирт.коды - https://snipp.ru/handbk/vk-code
скан коды - https://snipp.ru/handbk/scan-codes

И таблица от Microsoft (весьма любопытная):
https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
Please post your script code inside [code] ... [/code] block. Thank you.

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 29 Nov 2022, 11:25

@vmech
где взять коды клавиш?
-
В гугле не пробовал ?
1) Речь шла о кодах в контексте Oscar Editor. По вашим ссылкам, наприер на Пробел, выдает коды
от Microsoft: VK_SPACE 0x20 SPACEBAR
Скан-коды: DEC 57 HEX 0x39
В оскаре же, после написания макроса в Ui кода не видно, но открыв в текстовом редакторе, выдает код "44". Я искал именно оскаровские коды для F13-F24. Таких в нем нет. Другие "форматы" кода клавиш мне не помогли бы.
Если кому интересно, путь для открытия скрипта: C:\Program Files (x86)\X7 Oscar Keyboard Editor\ScriptsMacros\Russian\MacroLibrary
oscar space.png
oscar space.png (647.23 KiB) Viewed 2162 times
2)
у кнопок G1-G16 нет собственных сканкодов. Поэтому «поймать» их не удастся (потому что ловить то и нечего :D )
Долго мучался с AHKHID, в конце концов какие-то коды нашлись. Правда, только на g1-g7 клавиши. Не думаю, что кто-то сможет помочь с остальными, слишком уж глубоко копать, мало энтузиастов.

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 29 Nov 2022, 11:57

Скину свой конспект на случай если кто-то столкнется с этой же проблемой и найдёт этот тред.
Возможен бинд именно физических клавиш. Вроде также можно программировать удаленные устройства типа пультов от ТВ.

По ссылке все расписано норм (лучше сначала всю страницу прочитать), но там на англ язе и не наглядно (картинки в треде удалились): https://www.autohotkey.com/board/topic/38015-ahkhid-an-ahk-implementation-%20of-the-hid-functions/

1. запустить example 1
2. открыть вкладку Other
3. заскринить значения
4. отключить клаву
5. посмотреть изменившиеся значения = это значения нужной клавиатуры. Vendor ID Product ID Version Number Usage Page Usage
у меня выдавало 2 строки, но в конце заработали значения только из одной строки.
6. запустить example 2
7. вставить Usage Page and Usage в соответствующие поля.
8. нажать Add, call. аргументы вроде не нужны
9. прокликать физические клавиши - должны работать
10. вставить в код свои значения (из example 1)

Code: Select all

#Include %A_ScriptDir%\AHKHID.ahk
#Include AHKHID.ahk

;Create GUI to receive messages
Gui, +LastFound
Gui_ForHandleArgument := WinExist()

;Intercept WM_INPUT messages
WM_INPUT := 0xFF
OnMessage(WM_INPUT, "InputMsg")

UsagePageVersion1 := AHKHID_Register(ВАШ_UsagePage, ВАШ_Usage, Gui_ForHandleArgument, RIDEV_INPUTSINK)
Return

InputMsg(wParam, lParam) {
    Local devh, iKey, sLabel
    
    Critical
    
    ;Get handle of device
    devh := AHKHID_GetInputInfo(lParam, II_DEVHANDLE)
    
    If (AHKHID_GetDevInfo(devh, DI_DEVTYPE, True) = RIM_TYPEHID)
    And (AHKHID_GetDevInfo(devh, DI_HID_VENDORID, True) = 2522) ;вставить ваш VENDORID
    And (AHKHID_GetDevInfo(devh, DI_HID_PRODUCTID, True) = 37056) ;вставить ваш PRODUCTID
    And (AHKHID_GetDevInfo(devh, DI_HID_VERSIONNUMBER, True) = 280) ;вставить ваш VERSIONNUMBE

        ;Get data
        AHKHID_GetInputData(lParam, uData)  
        iKey := NumGet(uData, 0, "UInt")
        sLabel := "RC_" . iKey
        
        ;изначально для получения кодов предлагаю:
        Send, %iKey%_ ; <- при нажатии на физич клавишу она напечатает свой код. 
        
        ;когда выпишите все коды - замените это строку выше на:
        if IsLabel(sLabel)
        Gosub, %sLabel%
        ; и нужно дописать функцию-процедуру, которая выполнится по коду. название RC_+ваш код
    }
}

RC_539344388: 
    MsgBox, work ; здесь ваша логика для выполнения по нажатию клавиши
Return
11. изначально для получения кодов предлагаю вытянуть их так
Send, %iKey%_ ; <- при нажатии на физич клавишу она напечатает свой код.
12. дописать код вызова процедуры при клике

Code: Select all

if IsLabel(sLabel)
        Gosub, %sLabel%
Коды g клавиш для клавиатуры X7 g800V:
1 19250692
2 36027908
3 69582340
4 136691204
5 270908932
6 539344388
7 1076215300

Пункты 6-9 вроде можно пропустить? Там выдаются длинные коды (еще одни. из 19 символов), но что с ними делать не знаю.
g10 нажать = 04BE254000200000080
6 нулей после 2
g10 отпустить = 04BE250000000000080
В ecample 2 работают все клавиши. Но вот в пункте 11 на клавиши g9-g16 код общий, т.е. использовать их не удастся.
image.png
image.png (42.05 KiB) Viewed 2155 times

csharperHH
Posts: 9
Joined: 20 Nov 2022, 19:07

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by csharperHH » 29 Nov 2022, 16:22

Коды g клавиш для клавиатуры X7 g800V:
1 19250692
...
Оказывается, они динамические. Вот сейчас изменились, не не знаю отчего.

vmech
Posts: 353
Joined: 25 Aug 2019, 13:03

Re: Помогите настроить перехват доп клавиш с клавиатуры. Выудить коды клавиш.

Post by vmech » 30 Nov 2022, 09:03

@csharperHH
Это больше похоже на хэндлы, или коды событий (внутренних, которые генерирует/извлекает сам AHKHID).
Я не разбирался с этим скриптом, поэтому не берусь что либо утверждать.

Я тут покопался в своём (мышином) Oscar'е, и сделал следующее:
В пустой макрос внёс коды 1-999, и загрузил его в редактор макросов.
Редактор выдал следующую таблицу:
Spoiler
Числа слева соответствуют кодам нажатий в редакторе. Дальше 310 (до 999) никаких кодов нет. Просто пусто.
Напомню - это из мышиного Oscar'а.

ЗЫ. Хочу обратить внимание на коды 130,131,132 - вероятно <Reserve> означает зарезервированные события, а не отсутствующие как в Reserve. Т.е. потенциально эти коды могут что то делать, а м.б. и нет. Но это на свой страх и риск, как говорится :D

Эпилог: Судя по всему, редактор макросов Oscar не оперирует вообще никакими кодами клавиш - ни виртуальными, ни сканкодами. Вместо этого он содержит некий транслятор событий, связанный с обработчиком нажатий клавиш. Некоторые события вызывают простую генерацию нажатий и отпусканий конкретных (единичных) клавиш, а некоторые вызывают более сложные действия - такие например, как комбинации клавиш, и даже передачу через COM команд для ОС и программ.

Т.е. другими словами, даже через Oscar прямого доступа к железу получить не получится. Только мухлевать с редактором макросов, и пытаться отлавливать коды нажатий в Autohotkey.

Вот код самого макроса. Просто сохрани его с расширением .amc, и открой в редакторе макросов. Он покажет тебе таблицу кодов и доступных событий (номера строк в листинге будут соответствовать кодам ;) )
Spoiler
Please post your script code inside [code] ... [/code] block. Thank you.

Post Reply

Return to “Помощь”