Нижеприведенная функция убивает все возможные окна от запущенного ей процесса и если какие-либо окна появлялись - перезапускает прогу заново (убиваются окна также дочерних процессов, просто одноименные окна\процессы не затрагиваются)
Код:

;~ Пример запускает+закрывает setup.exe:
RunKillWin(@SystemDir&"\setup.exe")
;~ Использование:
;~ RunKillWin("Путь и имя файла"[, таймаут ожидания завершения выполнения exe(сек)][,количество попыток "тихого" выполнения])
;~ Возвращает количесто выполненых попыток
Func RunKillWin($Exe,$MaxTimeOutForProcess=300,$MaxCountToReRun=10)
Local $i,$PID,$Timer,$WinArr,$y,$z=0
For $i=1 To $MaxCountToReRun
;~ Корявая поверка необходимости перезапуска
If $z=1 Then ExitLoop
$z=1
$PID=Run($Exe)
;~ Запуск таймера таймаута выполнения
$Timer=TimerInit()
While ProcessExists($PID)
;~ Сверка таймера
If TimerDiff($Timer)>$MaxTimeOutForProcess*1000 Then
ProcessClose($PID)
If Not(ProcessWaitClose($PID,30)) Then Return -1
$z=0
ContinueLoop 2
EndIf
$WinArr=WinList()
For $y=1 To $WinArr[0][0]
If Not(WinGetProcess($WinArr[$y][1])=$PID) Then ContinueLoop
;~ Собственно действие над окном\доп. проверку его титла можно поменять здесь
WinKill($WinArr[$y][1])
$z=0
Next
WEnd
Next
Return $i-1
EndFunc