OnMyDSeeAtAll
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору vadim3sh 23:17 27-09-2013 Цитата:Энтузазизм. Цитата: 2. У меня win 7. Работает, но почему-то не с 1 раза. | У меня нормально. Цитата: 3. И у меня не получается разобраться как работает этот блок: | Примерно так. Цитата: ...показать вариант для одиночного нажатия? | В том коде нужно чуть изменить горячую клавишу. oshizelly 02:06 29-09-2013 Цитата: ...при подключении внешней клавиатуры автоматически его приостанавливать (или наоборот)? | У меня есть старая клавиатура, и ради интереса я попробовал через WMI определять это событие. Зашёл в диспетчер устройств, там при отключённой USB-клавиатуре только моя PS/2. Чтобы не перепутать посмотрел её код производителя оборудования (VID), потом узнал глобально уникальный идентификатор (GUID) класса. Подключил вторую клавиатуру и проверил её VID, он отличался от VID'а который смотрел первым (собственно вторая клава всегда у меня была под первой), далее выяснил VID "родителя", данные об GUID класса и VID'е "родителя" записал в код: Код: #SingleInstance, Force ListLines, Off IfEqual, A_IsAdmin, % False, Run, % "*RunAs """A_ScriptFullPath """" OnExit, % "ExitScript" Menu, Tray, NoStandard Menu, Tray, Add, % "&Exit", % "ExitScript" Global bState:=False WndProc(), OnMessage(WM_USERDEFINED:=0x2013, "WndProc"), sFileName:="NQuery.ahk" FileAppend, % `" ( #NoTrayIcon #KeyHistory, 0 ListLines, Off DetectHiddenWindows, On classGUID:=""{745a17a0-74d3-11d0-b6fe-00a0c90f57da}"" parentId:=""USB\VID_1241&PID_1503&MI_00\6&20ba3bb&0&0000"" uPID:="DllCall("GetCurrentProcessId", "UInt")", WM_USERDEFINED:="WM_USERDEFINED " oWMIEvent:=ComObjGet(""WinMgmts:\\""A_ComputerName ""\root\CIMV2"") .ExecNotificationQuery(""SELECT * "" . ""FROM __InstanceOperationEvent "" . ""WITHIN 3 "" . ""WHERE "" . ""TargetInstance ISA 'Win32_PnPEntity' "" . ""AND "" . ""TargetInstance.ClassGuid='""classGUID ""'"") Loop If oWMIEvent.NextEvent.TargetInstance.DeviceID=parentId PostMessage, WM_USERDEFINED,,,, `% ""ahk_pid""uPID )`", % sFileName Run, % sFileName,,, uPID #If, bState PgUp::Home PgDn::End ExitScript: Process, Close, % uPID Process, WaitClose, % uPID FileDelete, % sFileName ExitApp WndProc() { Static parentId:="USB\VID_1241&PID_1503&MI_00\6&20ba3bb&0&0000" , oWMI:=ComObjGet("WinMgmts:\\"A_ComputerName "\root\CIMV2") , sQuery:="SELECT DeviceID FROM Win32_Keyboard" For colItem In oWMI.ExecQuery(sQuery) bState:=colItem.DeviceID=parentId ? True:False Until, bState Menu, Tray, Icon, % "msctf.dll", % "-41"(bState ? 5:9) TrayTip, % "status:", % (bState ? "c":"disc")"onnected",, 1 Sleep, 1750 TrayTip } | Сценарий формирует файл другого сценария и запускает его (при корректном выходе его удаляет), который подписывается на событие и если таковое происходит уведомляет родительский сценарий заставляя проверять нужный WMI класс на предмет присутствия нужного кода производителя оборудования. Результат проверки будет контекстом для горячих клавиш. 12:34 30-09-2013 Цитата: А нельзя ли сделать так... | Так попробуйте. |