marusa122 wrote: ↑Эксель открывается, но если потом развернуть еще какое-нибудь окно - он скрывается под ним.
Хм, такого быть не должно. К сожалению, удалённо такие вещи отлаживать тяжело: может, у вас файл зовётся не Excel.exe, а как-то иначе; или Эксель запущен под администратором, и скрипт не имеет над ним власти; или какое-то другое окно (может быть, в том же самом Экселе) оказывается поверх всех, но это неочевидно...
Остаётся только отлаживать скрипт шаг за шагом, проверяя и документируя каждую деталь:
Code: Select all
; При нажатии кнопки Start запускаем приложение с указанными в текстовых полях данными
OnButtonRun:
Gui, Submit
if (Ed_App4 = "")
{
Ed_App4 = %A_ScriptDir%\Шаблон документа.xlsm
}
; Отладочная информация будет сохранена в файл my_debug.txt
debugfile := FileOpen("my_debug.txt", "w")
debugfile.Write("Перед запуском: ")
GoSub debug_activewindowinfo
WinGet, debug_exstyle, ExStyle, A
debugfile.WriteLine("Активное окно поверх всех: " (debug_exstyle & 0x8))
debugfile.WriteLine("Пытаемся запустить: " Ed_App4)
Run %Ed_App4%, %A_ScriptDir%, UseErrorLevel, appPid
debugfile.WriteLine("После Run: ErrorLevel = " ErrorLevel)
debugfile.WriteLine("ID запущенного процесса " appPid)
If (ErrorLevel == "ERROR") {
MsgBox 0x30, Какая досада..., Не удалось запустить программу!
debugfile.WriteLine("Запуск не удался")
Return
}
debugfile.Write("После запуска: ")
GoSub debug_activewindowinfo
Sleep 5000
MsgBox, 64, Программа1, Программа1 запущена! `nЗдесь вы сможете начать работу с выбранным документом, 5
debugfile.WriteLine("Проверка на экселевский файл: " (Ed_App4 ~= "\.(xls|xlsx|xlsm)$"))
If (Ed_App4 ~= "\.(xls|xlsx|xlsm)$") {
debugfile.Write("Перед активацией Excel: ")
GoSub debug_activewindowinfo
WinActivate ahk_exe Excel.exe
debugfile.Write("После активации Excel: ")
GoSub debug_activewindowinfo
}
; Ставим окно всегда сверху
WinGet, debug_exstyle, ExStyle, A
debugfile.WriteLine("Активное окно поверх всех (перед): " (debug_exstyle & 0x8))
WinSet, AlwaysOnTop, On, A
WinGet, debug_exstyle, ExStyle, A
debugfile.WriteLine("Активное окно поверх всех (после): " (debug_exstyle & 0x8))
debugfile.Write("Перед выходом: ")
GoSub debug_activewindowinfo
Return
debug_activewindowinfo:
WinGetTitle, debug_title, A
WinGet, debug_processname, Process, A
WinGet, debug_processid, Process, A
debugfile.WriteLine(Format(" Активное окно: заголовок='{1}', процесс: '{2}' ({3})"
, debug_title, debug_processname, debug_processid))
Return
Возможен ли вариант, чтобы при запуске скрипт как-то "убивал" старый процесс Экселя и запускал новый?
Возможен, но желательно ли это? Вдруг у человека там важные данные, с которыми он целый день работал и не успел сохранить?
Code: Select all
; При закрытии может выскочить запрос, хотим ли мы сохранить файл:
WinClose, ahk_exe excel.exe
; Более сурово, безо всяких запросов и сохранений:
Process, Close, excel.exe