Показать полную графическую версию : Завершить приложение
А_н_д_р_ей
24-06-2014, 14:39
Здравствуйте.
Очень нужен код AutoIt который будет корректно завершать приложение. Чтобы закрывал процесс - programm.exe выгружал его из памяти, и сам AutoIt завершался/выгружался из памяти. Вот. :)
madmasles
24-06-2014, 15:32
А_н_д_р_ей,
У разных приложений корректность завершения разная. Конкретики бы хотелось.
А_н_д_р_ей
24-06-2014, 17:33
У разных приложений корректность завершения разная. Конкретики бы хотелось. »
это будет обозреватель firefox :)
madmasles
24-06-2014, 19:10
это будет обозреватель firefox »Для нее есть FF.au3 (V0.6.0.1b-10) (http://www.autoitscript.com/forum/topic/95595-ffau3-v0601b-10/?hl=%20mozilla%20%20firefox)
На autoit-script.ru есть Стол заказов (http://autoit-script.ru/index.php?board=8.0)
Вариант попроще
Global $title
If ProcessExists("firefox.exe") Then
$title = _Process2Win("firefox.exe")
WinClose($title)
EndIf
Func _Process2Win($pid)
If IsString($pid) Then $pid = ProcessExists($pid)
If $pid = 0 Then Return -1
$list = WinList()
For $i = 1 To $list[0][0]
If $list[$i][0] <> "" AND BitAnd(WinGetState($list[$i][1]),2) Then
$wpid = WinGetProcess($list[$i][0])
If $wpid = $pid Then Return $list[$i][0]
EndIf
Next
Return -1
EndFunc
Без taskkill.exe, практически то же самое, что нажать на крестик.
Без taskkill.exe, практически то же самое, что нажать на крестик. »
Только это совсем не то, что нужно. Ибо:
If multiple windows match the criteria, the window that was most recently active is closed.
И закрывать все найденные окна тоже не верно — нужно закрывать именно приложение.
Посему как-то так:
#include <WindowsConstants.au3>
#include <WinAPI.au3>
_WinAPI_PostMessage(WinGetHandle("[CLASS:MozillaWindowClass; REGEXPTITLE:.* - Mozilla Firefox]"), $WM_QUIT, 0, 0)
madmasles
30-06-2014, 19:17
Посему как-то так: »А если окон Firefox больше одного?
Проверил, все окна закрываются, только я оставил один класс ([CLASS:MozillaWindowClass]). Единственный минус (существенный), если в момент запуска скрипта открыто диалоговое окно, например, Настройки ([CLASS:MozillaDialogClass]), то Firefox намертво зависает (у меня).
А если окон Firefox больше одного? »
Именно поэтому пользуем не WinClose(). Если закрывать «пооконно» — то, при следующем открытии Firefox (если установлено «Показать окна и вкладки, открытые в прошлый раз»), все его окна, окромя последнего будут потеряны.
Единственный минус (существенный), если в момент запуска скрипта открыто диалоговое окно, например, Настройки ([CLASS:MozillaDialogClass]), то Firefox намертво зависает (у меня). »
Я не проверял, но не сомневаюсь. С модальными диалогами тяжко работать — надо предусматривать все возможные «чихи». Сюда же идут запросы по закрытию приложений, запросы сохранения содержимого и т.п.
madmasles
01-07-2014, 02:25
Сюда же идут запросы по закрытию приложений, запросы сохранения содержимого и т.п. »ИМХО, надо изучать FF.au3 (V0.6.0.1b-10) (http://www.autoitscript.com/forum/topic/95595-ffau3-v0601b-10/?hl=%20mozilla%20%20firefox) для того, чтобы действительно корректно закрывать Firefox.
А там нечего изучать — делается опосредованный вызов внутренней функции Firefox «goQuitApplication()», всё содержимое которой:
function goQuitApplication()
{
if (!canQuitApplication())
return false;
var appStartup = Components.classes['@mozilla.org/toolkit/app-startup;1'].
getService(Components.interfaces.nsIAppStartup);
appStartup.quit(Components.interfaces.nsIAppStartup.eAttemptQuit);
return true;
}
(см.: chrome://global/content/globalOverlay.js).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.