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 Цитата:|  А нельзя ли сделать так...  |   Так попробуйте. |