Это отличная программа, но все-же в ней не хватает одной важной для меня функции, а именно: автоматического переподключения при подключении телефона к USB. С другой стороны в ней есть такая опция, как "Подключаться при запуске".
Отсюда у меня появилась идея написать скриптик, который будет прибивать процесс MyPhoneExplorer при отключении телефона и запускать при подключении.
Наконец я оформил это на VBScript. Этот скрипт наблюдает за подключением/отключением устройства под названием "Android ADB Interface" и выполняет соответствующие действия:
Const DEVICENAME = "Android ADB Interface" Const EXENAME = "MyPhoneExplorer.exe" Dim lastOperation Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2") 'Выйти, если скрипт уже запущен If alreadyRunning() Then: WScript.Quit Set objSink = WScript.CreateObject("WBemScripting.SWbemSink","event_") Set objShell = CreateObject("WScript.Shell") Set deviceIDs = CreateObject("Scripting.Dictionary") 'Установим перехватчик событий objWMIService.ExecNotificationQueryAsync objSink, "Select * from __InstanceOperationEvent within 1 where TargetInstance ISA 'Win32_PnPEntity'" 'Получим ID устройств по заданному имени EnumerateDevices DEVICENAME objShell.Popup "Мониторинг USB начат!",2 'Бесконечный цикл Do WScript.Sleep 1000 Loop 'Перехватчик событий подключения/отключения USB устройств Sub event_OnObjectReady( objEvent, objContext ) With objEvent If deviceIDs.Exists(.TargetInstance.DeviceId) Then Select Case .Path_.Class Case "__InstanceCreationEvent" If lastOperation <> "Insert" Then lastOperation = "Insert" OnInsert End If Case "__InstanceDeletionEvent" If lastOperation <> "Remove" Then lastOperation = "Remove" OnRemove End If End Select End If End With End Sub Sub OnInsert objShell.Run EXENAME,1,0 End Sub Sub OnRemove objShell.Run "taskkill /f /im " & EXENAME,0,0 End Sub Sub EnumerateDevices(name) Set objDevices = objWMIService.ExecQuery("SELECT DeviceId FROM Win32_PnPSignedDriver WHERE Description='" & name & "'") For Each dev in objDevices deviceId = dev.DeviceId If Not deviceIDs.Exists(deviceId) Then deviceIDs.Add deviceId, deviceId End If d = d + 1 Next End Sub Function alreadyRunning() alreadyRunning = False wscrCount = ProcessCount( "%wscript%" & WScript.ScriptName & "%" ) cscrCount = ProcessCount( "%cscript%" & WScript.ScriptName & "%" ) If wscrCount > 1 or cscrCount > 1 Then:alreadyRunning = True End Function Public Function ProcessCount(likestr) Set colItems = objWMIService.ExecQuery("SELECT Name,CommandLine FROM Win32_Process WHERE CommandLine Like '" & likestr & "'") ProcessCount = colItems.Count End Function
VBS-файл можно скачать здесь
Комментариев нет:
Отправить комментарий