1

Тема: AHK: Работа с AHKHID

Доброго времени суток.

У меня клавиатура от OKLICK, на которой есть скролл, как на мышке.
Задача - сделать управление громкостью через этот скролл.
Стандартный драйвер не работает. Именно моя версия клавиатуры (780L Win7) не поддерживается.

Через программу Keybord Maniac мне удалось решить задачу, но хотелось бы использовать не несколько программ, а только AHK.

Также, с помощью Keybord Maniac я знаю, что именно за этот скролл отвечают кнопки HID:
00000000280000003D00010000000000000000000004780000000000000000000000000000000000
00000000280000003D0001000000000000000000000488FF00000000000000000000000000000000
Скролл вверх и вниз соответственно.

С самим изменением громкости в AHK я разобрался, правда не через SoundSet +10, он почему-то не работает, а просто, через Send, {Volume_Up}.

Осталось только сделать возможность "перехватить" действие со скролла.

Нашёл библиотеку AHKHID.ahk и установил её в \AutoHotkey\Lib.
example_1.ahk от этой библиотеки запускается, но не видит устройств, в чём дело?
http://i.imgur.com/AzrI96R.png

2

Re: AHK: Работа с AHKHID

У меня работает, AHK 1.1.15.0 32бит Unicode, win8.1 32бит.
Проверь, покажет ли общее количество устройств такой скрипт:

MsgBox % AHKHID_GetDevCount()

3

Re: AHK: Работа с AHKHID

Irbis пишет:

У меня работает, AHK 1.1.15.0 32бит Unicode, win8.1 32бит.
Проверь, покажет ли общее количество устройств такой скрипт:

MsgBox % AHKHID_GetDevCount()

AHK 1.0.48.05 (актуальная версия с сайта)
Win 7 64 бита

MsgBox % AHKHID_GetDevCount()

Выводит -1

4

Re: AHK: Работа с AHKHID

Vlad Dae пишет:

AHK 1.0.48.05 (актуальная версия с сайта)

Данная (basic) версия не актуальна уже ~5 лет, автор ее не развивает.
Новую версию можно скачать тут.

5

Re: AHK: Работа с AHKHID

Ооо, действительно! Дело было в версии.
Спасибо. Я бы сам не догадался.

6

Re: AHK: Работа с AHKHID

Задачу решил, но не в полной мере.
Вот код на данный момент:


; подключаем ГУИ для получения сообщений
Gui +LastFound -Resize -MaximizeBox -MinimizeBox
Gui, Add, Text, x0 y0 w400 h300 vt1 , none
GuiHandle := WinExist()

; подключаем константы AHKHID
AHKHID_UseConstants()

; при получении сообщения запускаем функцию InputMsg
WM_INPUT := 0x00FF
OnMessage(WM_INPUT, "InputMsg")

; регистрируем клаву. чтобы мы могли принимать с неё значения
; RIDEV_INPUTSINK - чтобы принимали сообщения в фоновом режиме
keydoard := AHKHID_Register(1, 2, GuiHandle, RIDEV_INPUTSINK )

;Show GUI
;Gui, Show

; Окончание секции авто-выполнения. Скрипт ожидает каких-нибудь действий пользователя.
Return 




;-----------------------------------------
; обробатывает входящее сообщение

InputMsg(wParam, lParam) {
    Local DevHandle, VKey, sLabel, ProdName
    
    Critical    ;Or otherwise you could get ERROR_INVALID_HANDLE
    
    ;получаем II_DEVHANDLE
    DevHandle := AHKHID_GetInputInfo(lParam, II_DEVHANDLE) 
    
    ProdName = % AHKHID_GetDevName(DevHandle, True) ;имя устройства    
    
    ; если имя устройства как у моей клавиатуры
    if ProdName = \\?\HID#VID_0518&PID_0001&MI_01&Col01#8&3125ebc9&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
    {
        
        ; получаем ключ кнопки
        VKey = % AHKHID_GetInputInfo(lParam, II_KBD_VKEY)

        ; получаем имя процедуры этой кнопки
        sLabel := "Key_" VKey
        
        ; если такая процедура есть - вызываем её
        If IsLabel(sLabel)
            Gosub, %sLabel%
            
    }
}

;-----------------------------------------
; воспроизводит звук

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




;------------------------------------------------------------- назначение клавиш

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

;keyboard scroll down
Key_65416:
    SoundSet -5
    Send, {WheelUp}
    Sound()
Return

SoundSet на новой версии тоже заработал.

Вопрос знатокам:
У меня получается две мыши. Одна на клавиатуре, а вторая обычная.
Задать свои функции на колесико удалось, но как теперь сделать так, чтобы это колёсико не выполняло свою обычную функцию, скроллинг?

Пока я сделал костыль, в виде Send, {WheelUp}, когда на клавиатуре колёсико двигаем вниз. Чтобы возвращать скролл обратно. Но это работает не всегда.

7

Re: AHK: Работа с AHKHID

А скролл на клавиатуре определяется как WheelUp и WheelDown?

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

8

Re: AHK: Работа с AHKHID

Да.

9 (изменено: serzh82saratov, 2014-05-19 17:38:44)

Re: AHK: Работа с AHKHID

Не знаю может ли AHKHID перехватывать ввод, потому будем считать костылём:

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

#SingleInstance Force
#Persistent    
#NoEnv
ListLines Off  
SetBatchLines -1
Global IsMice2 
; подключаем ГУИ для получения сообщений
Gui +LastFound -Resize -MaximizeBox -MinimizeBox
Gui, Add, Text, x0 y0 w400 h300 vt1 , none
GuiHandle := WinExist()

; подключаем константы AHKHID
AHKHID_UseConstants()

; при получении сообщения запускаем функцию InputMsg
WM_INPUT := 0x00FF
OnMessage(WM_INPUT, "InputMsg")

; регистрируем клаву. чтобы мы могли принимать с неё значения
; RIDEV_INPUTSINK - чтобы принимали сообщения в фоновом режиме
keydoard := AHKHID_Register(1, 2, GuiHandle, RIDEV_INPUTSINK )

;Show GUI
;Gui, Show

; Окончание секции авто-выполнения. Скрипт ожидает каких-нибудь действий пользователя.
Return 




;-----------------------------------------
; обробатывает входящее сообщение

InputMsg(wParam, lParam) {
    
    Local DevHandle, VKey, sLabel, ProdName
    Static Mice2 := "\\?\HID#VID_0518&PID_0001&MI_01&Col01#8&3125ebc9&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
    
    Critical     
    
    DevHandle := AHKHID_GetInputInfo(lParam, II_DEVHANDLE) 
    ProdName := AHKHID_GetDevName(DevHandle, True) ;имя устройства     
  
    IsMice2 := ProdName = Mice2 ? 1 : 0
          
}

;-----------------------------------------
; воспроизводит звук

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




;------------------------------------------------------------- назначение клавиш

#If IsMice2

WheelUp::
    SoundSet +5
    Send, {WheelDown}
    Sound()
    Return

WheelDown::
    SoundSet -5
    Send, {WheelUp}
    Sound()
    Return

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

10 (изменено: serzh82saratov, 2014-05-19 22:08:54)

Re: AHK: Работа с AHKHID

Да, и танцы с гуи излишни.


#SingleInstance Force
#Persistent    
#NoEnv
ListLines Off  
SetBatchLines -1
 
AHKHID_UseConstants() 
AHKHID_Register(1, 2, A_ScriptHwnd, RIDEV_INPUTSINK ) 
OnMessage(0x00FF, "InputMsg") ; WM_INPUT
Mice2 = \\?\HID#VID_0518&PID_0001&MI_01&Col01#8&3125ebc9&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}
Return
 

InputMsg(wParam, lParam) {
    Local ProdName, DevHandle 
    Critical      
    DevHandle := AHKHID_GetInputInfo(lParam, II_DEVHANDLE) 
    ProdName := AHKHID_GetDevName(DevHandle, True) ;имя устройства     
    IsMice2 := ProdName = Mice2 ? 1 : 0  
} 

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

WheelUp::
    SoundSet +5 
    Sound()
    Return

WheelDown::
    SoundSet -5 
    Sound()
    Return

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

11

Re: AHK: Работа с AHKHID

Большое спасибо. Такой вариант работает как надо.