Протестировав предложенный скрипт, я тут сделал некоторые выводы.
1) Гораздо удобнее применять не VSPE, а vspd. Потому что vspd не требует запуска всякий раз, когда нам нужно получить порты. Однажды настроили - и всё. Это упрощает и скрипт тоже. К тому же не требуется отдельный файл конфигурации.
2) Обойтись без GPSGate никак не возможно, потому что нужно выполнить уже известные противоречивые требования: на момент запуска эмулятора порт, с которым эмулятор работает, должен существовать, но данных на нём быть не должно. Таким образом, нужно иметь в системе заранее сформированную пару виртуальных (но считающихся физическими) портов, один из которых задействован для соединения с эмулятором, второй является выходом GPSGate. Если при старте эмулятора GPSGate закрыт, то на второй порт ничего не передаётся, а первый порт существует, что и требуется.
3) Скрипт я немного модифицировал. Из ini-файла убрал параметры VSPE и задержки. Смысла через ini выставлять задержки я не вижу, хотя мне пришлось некоторые временнЫе параметры изменить, но они и не были записаны в ini. Добавил параметр "Горячая клавиша Навитела". Также я изменил способ закрытия процессов, не нужных в данный момент, так как предложенный метод у меня приводил к ошибкам.
Код:
#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
4) В Андроиде есть фича: назначение на приложения клавиш быстрого доступа. Нажимать эти клавиши необходимо совместно с клавишей "Поиск", каковой в эмуляторе является клавиша F5. Если на Навител назначить клавишу, например, "n", то, нажав "F5+n", можно запустить программу. Остаётся только передать через скрипт это сочетание клавиш, и проблема автозапуска решена.