1

Тема: AHK: Определение подлючения определенного USB устройства

Здравствуйте!
Есть задача, что бы скрипт чекал подключена ли миди-клавиатура по USB, или отключена. (вернее автивна ли она, т.к. USB всегда подключен, я выключаю ее по кнопке, что так же windows видит как подкление устройства).
При собитии включения скрипт должен запустить определенную программу, или закрыть ее при отключении миди-клавиатуры.
Собственно все что требуется.
С самим чеком через Settimer и открытием/закрытием ясно программы ясно, а вот с определением активности устройства не могу сообразить(очень новичёк).
Нашел код по теме:

OnMessage(0x219, "notify_change")
Return

notify_change(wParam, lParam, msg, hwnd)
{
MsgBox, %wParam% %lParam% %msg% %hwnd%
} 

Но он ищет вообще любые устройства.  DriveGet только для дисков к сожалению.  Еще находил чекер второго монитора, но это уж совсем не то. 
Есть ли функция по определению активности драйвера по UID / PID например ? Или устроит код по определению состояния ветки в реестре.

2

Re: AHK: Определение подлючения определенного USB устройства

Тема на оф. форуме, как получить список устройств.

3 (изменено: sim8783, 2021-03-05 20:50:23)

Re: AHK: Определение подлючения определенного USB устройства

Спасибо! А есть ли проще методы, без задействования стороннего ПО? (хоть и от майкрософт). Мне не нужен список, а состояние одного конкретного устройства, которое подключается даже в один и тот же порт USB. Может есть команда проверки активности порта USB? Через DDcall, или реестр как-нибудь?

4 (изменено: Alectric, 2021-03-05 21:52:30)

Re: AHK: Определение подлючения определенного USB устройства

serzh82saratov когда-то давал мне такой код.

Можно попробовать так:

For device in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_PnPEntity")
{
   MsgBox % device.name
}

Скорее всего можно отсеять лишнее заранее, но я не знаю какой фильтр нужно прописать ( Where ClassGuid = '{??????????}').

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5

Re: AHK: Определение подлючения определенного USB устройства

Уж лучше так выводить большое количество строк:

For device in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_PnPEntity")
 Text .= device.name "`n"
Gui Add, Edit, vTxt w500 h1000
GuiControl,, Txt, % Text
Gui Show,, Инфо:
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Определение подлючения определенного USB устройства

Ещё лучше так:

For device in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_PnPEntity")
   Text .= device.name "`n"
Gui Add, Edit, vTxt w500 h1000
Sort, Text
GuiControl,, Txt, % Text
Gui Show,, Инфо:
Send, ^{Home}
Return

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

7 (изменено: sim8783, 2021-03-06 21:06:16)

Re: AHK: Определение подлючения определенного USB устройства

Круто! Спасибо. Теперь есть список подключенных устройств, это хорошо.
Сейчас мне как то нужно это выразить в if и else, что бы задать действия открытия и закрытия программы в зависимости от наличия определенной строки. Я так понял только один вариант, нужно список сохранить в фаил, затем прочесть его через ReadLine, и присвоить состояние ошибки на If  и else. Но чувствую, что есть способ без лишних файлов..  Можно как то прочесть этот список в переменной Text напрямую? В моём случае при сканировании списка можно ведь обойтись без шаблонов регулярных выражений, т.к. имя одно и тоже "Axiom 61"?

Upd: удалось при помощи подсказки Alectric сократить список до одной строки: Axiom 61 (посредством ExecQuery("Select * from Win32_PnPEntity Where Name = 'Axiom 61'")). Но выявил ньюанс, что при каждом запросе в выдачу дублируется эта же строка, т.к. планирую ставить проверку активности устройства  на таймер с периодом около 2 секунд, то не вызовет ли это в какой то момент переполнения? Если было отключение устройства, то список обнуляется.

Upd2: Сделал через errorlevel, без возни с поиском конкретных слов. Теперь все портит переполнение выдачи от каждого запроса по ComObjGet, какой командой можно очистить память? Перезагрузка AHK помогает, но у меня и другие таймеры есть в скрипте, нужно что то другое.

8 (изменено: Alectric, 2021-03-06 22:09:31)

Re: AHK: Определение подлючения определенного USB устройства

sim8783 пишет:

Теперь все портит переполнение выдачи от каждого запроса

"Код в студию."

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

9

Re: AHK: Определение подлючения определенного USB устройства

Alectric пишет:

переполнение выдачи

Text := ""
For device in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_PnPEntity")
 Text .= device.name "`n"

10

Re: AHK: Определение подлючения определенного USB устройства

stealzy
Благодарю! Теперь все как нужно.

11

Re: AHK: Определение подлючения определенного USB устройства

msgbox,% checkDevice("HID-совместимое устройство")
msgbox,% checkDevice("HID-сов устройство")


checkDevice(DevName)
{
  q:="Select * from Win32_PnPEntity Where Name = '" DevName "'"
  For device in ComObjGet("winmgmts:").ExecQuery(q)
    return 1
  return 0
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.