Протестировав предложенный скрипт, я тут сделал некоторые выводы.
1) Гораздо удобнее применять не VSPE, а vspd. Потому что vspd не требует запуска всякий раз, когда нам нужно получить порты. Однажды настроили - и всё. Это упрощает и скрипт тоже. К тому же не требуется отдельный файл конфигурации.
2) Обойтись без GPSGate никак не возможно, потому что нужно выполнить уже известные противоречивые требования: на момент запуска эмулятора порт, с которым эмулятор работает, должен существовать, но данных на нём быть не должно. Таким образом, нужно иметь в системе заранее сформированную пару виртуальных (но считающихся физическими) портов, один из которых задействован для соединения с эмулятором, второй является выходом GPSGate. Если при старте эмулятора GPSGate закрыт, то на второй порт ничего не передаётся, а первый порт существует, что и требуется.
3) Скрипт я немного модифицировал. Из ini-файла убрал параметры VSPE и задержки. Смысла через ini выставлять задержки я не вижу, хотя мне пришлось некоторые временнЫе параметры изменить, но они и не были записаны в ini. Добавил параметр "Горячая клавиша Навитела". Также я изменил способ закрытия процессов, не нужных в данный момент, так как предложенный метод у меня приводил к ошибкам.
4) В Андроиде есть фича: назначение на приложения клавиш быстрого доступа. Нажимать эти клавиши необходимо совместно с клавишей "Поиск", каковой в эмуляторе является клавиша F5. Если на Навител назначить клавишу, например, "n", то, нажав "F5+n", можно запустить программу. Остаётся только передать через скрипт это сочетание клавиш, и проблема автозапуска решена.Код:#include <Constants.au3> #include <GUIConstantsEx.au3> If WinExists(@ScriptName) Then Exit ; если окно скрипта с новым именем уже существует, выходим AutoItWinSetTitle(@ScriptName) ; в противном случае даём окну новое имя $sLog = '' ; лог обнуляем $Config = @ScriptDir & "\config.ini" ; загружаем параметры из конфига $EmulatorCommand = IniRead ( $Config, 'Emulator', 'EmulatorCommand','' ) ; командная строка эмулятора $NavitelHotKey = IniRead ( $Config, 'Emulator', 'NavitelHotKey', '' ) ; горячая клавиша Навитела $GPSGatePath = IniRead ( $Config, 'Emulator', 'GPSGatePath', '' ) ; путь к GPSGate If ProcessExists ( 'GpsGateXP.exe' ) Then ; если GPSGate уже запущен, то ProcessClose ( "GpsGateXP.exe" ) ; закрываем GpsGate Sleep ( 500 ) ; пауза EndIf If ProcessExists ( 'emulator.exe' ) Then ; если эмулятор уже запущен, то ProcessClose ( "emulator.exe" ) ; закрываем эмулятор Sleep ( 500 ) ; пауза EndIf $EmulatorStart = Run ( @ComSpec & $EmulatorCommand, '' , @SW_HIDE , $STDOUT_CHILD ) ; запускаем эмулятор WinWaitActive ( "[CLASS:#32770]","",5 ) ; ждём 5 сек появления окна свойств COM порта Send ( '{ENTER}' ) ; нажимаем OK WinWaitActive ( "[CLASS:SDL_app]","",5 ) ; ждём 5 сек появления окна эмулятора While ProcessExists ( 'emulator.exe' ) ; пока существует процесс эмулятора, $sLog = StdoutRead ( $EmulatorStart ) ; читаем из потока эмулятора Sleep ( 1000 ) ; каждую секунду $array = StringRegExp ( $sLog, "Sucessfully mounted vfat filesystem" , 0 ) ; если в поток вышло указанное сообщение, If $array Then ExitLoop ; выходим из цикла WEnd Sleep ( 100 ) ; пауза WinActivate ( "[CLASS:SDL_app]" ) ; переходим в окно эмулятора Send ( '{F2}' ) ; жмём F2, разблокируем экран Sleep ( 2000 ) ; ждём 2 сек WinActivate("[CLASS:SDL_app]") ; переходим в окно эмулятора Send ( "{F5 down}" ) ; жмём F5 Send ( "{"&$NavitelHotKey&"}" ) ; жмём горячую клавишу Send ( "{F5 up}" ) ; отпускаем F5 Run ( $GPSGatePath ) ; запускаем GpsGate Exit![]()




Ответить с цитированием
