2015-06-12 2 views
1

У меня есть HTA, который минимизируется при выполнении резервного копирования. После завершения этой резервной копии я хотел бы восстановить HTA, но у меня проблемы.Восстановить минимизированное приложение через VBS в HTA

Я пробовал несколько вещей (ниже), но без успеха. Кто-нибудь может указать мне на окончательное решение?

Сначала я попытался просто активировать HTA, но это не удалось. Я не эксперт, но я понимаю, что делать это следует подражать щелчок мыши на ОМТ в панели задач, тем самым восстановить его -

Sub RestoreBackupHTA() 

    Shell.AppActivate "Backup" 

End Sub 

Далее я попытался активировать HTA, а затем отправить ключи «восстановить» активное окно, но это также не удалось -

Sub RestoreBackupHTA() 

    Shell.AppActivate "Backup" 
    Shell.SendKeys "% r" 

End Sub 

Наконец я попытался первым активировать HTA, а затем отправить ключи «восстановить» активное окно после короткого тайм-аута (я нашел пару сообщений что это может помочь гарантировать, что HTA был полностью активен, прежде чем отправлять ключи для его восстановления), но опять же, отказ -

Sub RestoreBackupHTA() 

    Shell.AppActivate "Backup" 
    Call window.setTimeout("RestoreBackupHTAAfterWait", 500, "VBScript") 

End Sub 

Sub RestoreBackupHTAAfterWait() 

    '** Create a tempory Shell object (required as the global Shell object is out of scope for some reason *' 
    Dim tmpShell 
    Set tmpShell = CreateObject("Wscript.Shell") 

    tmpShell.SendKeys "% r" ' Restore the HTA 

    Set tmpShell = Nothing ' Destroy the tmpShell object 

End Sub 

Примечания -

  1. HTA имеет идентификатор "Backup" (<HTA:APPLICATION ID="Backup" ... />, and so "Backup" is displayed in the title bar when it is running (and as the title in the task manager). This is why I'm using it as the название parameter for Shell.AppActivate`, и в соответствии с this MSDN page, который должен быть правильным.
  2. Shell объявлен и установлен глобально, поэтому он доступен для процедуры RestoreBackupHTA в приведенных выше примерах.
+0

Как ваш HTA был сведен к минимуму для выполнения резервного копирования? – omegastripes

ответ

2

Хм. Казалось, это сработало для меня. Мой заголовок окна показывает полный путь к ОМТ, так что я просто попробовал следующее (после использования setTimeout):

With CreateObject("WScript.Shell") 
    .AppActivate("test.hta") 
    .SendKeys "% r" 
End With 

И не было никаких проблем.

Но вот еще один способ. Вы можете использовать nircmd (всегда удобно иметь под рукой).

CreateObject("WScript.Shell").Run "nircmd.exe win normal ititle Backup" 

Это приведет к восстановлению любых окон с помощью «Резервного копирования» в названии. Вы можете фильтровать множество способов (название, класс, PID и т. Д.), Если вам нужен более тонкий контроль.

+0

К сожалению, ваше предложение 'nircmd' генерирует ошибку, и ваше другое предложение дает то же результаты, что и моя собственная работа.Тем не менее, я проводил еще несколько тестов, и кажется (странно), что если я нажму на другую заявку в ходе резервного копирования (когда HTA будет сведена к минимуму), она будет восстановлена. Если я не отключаю его и вместо этого сижу и жду, он не будет восстановлен. –

+0

Если вы идете по маршруту nircmd, вам нужно убедиться, что вы поместили исполняемый файл в папку, включенную в переменную окружения 'path', например' c: \ windows'. В противном случае вам нужно указать полный путь к exe в методе 'Run()'. – Bond

0

Поскольку вы используете HTA, вы можете использовать параметр SINGLEINSTANCE

<HTA:APPLICATION ID="RestoreMe" SINGLEINSTANCE="yes"> 

так, что при перезапуске приложения HTA ​​он обманет окна для восстановления существующего приложения HTA:

Set objShell = CreateObject("WScript.Shell") 
objShell.run location.href 

Чтобы проиллюстрировать это, я создал ложное приложение HTA, которое вы должны свести к минимуму в течение первых 5 секунд его запуска. Через 5 секунд он восстановит себя:

<!DOCTYPE html> 
<HEAD> 
<TITLE>Restore Me</TITLE> 
<HTA:APPLICATION ID="RestoreMe" SINGLEINSTANCE="yes"> 
<SCRIPT language="VBScript"> 
Sub RestoreMe 
    Set objShell = CreateObject("WScript.Shell") 
    objShell.run location.href 
End Sub 
Call window.setTimeout("RestoreMe", 5000) 
</SCRIPT> 
</HEAD> 
<BODY> 
</BODY> 
</HTML> 
+0

Спасибо за ответ, но, скорее, это похоже на появление дополнительных экземпляров HTA, а не восстановление оригинала. В свою очередь, каждый вновь созданный экземпляр порождает еще один новый экземпляр. Я ушел из кабинета в течение 5 минут и имел около 65 экземпляров, работающих по возвращении! –

Смежные вопросы