Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Завершить приложение (http://forum.oszone.net/showthread.php?t=284105)

А_н_д_р_ей 24-06-2014 14:39 2367881

Завершить приложение
 
Здравствуйте.
Очень нужен код AutoIt который будет корректно завершать приложение. Чтобы закрывал процесс - programm.exe выгружал его из памяти, и сам AutoIt завершался/выгружался из памяти. Вот. :)

madmasles 24-06-2014 15:32 2367913

А_н_д_р_ей,
У разных приложений корректность завершения разная. Конкретики бы хотелось.

А_н_д_р_ей 24-06-2014 17:33 2367980

Цитата:

Цитата madmasles
У разных приложений корректность завершения разная. Конкретики бы хотелось. »

это будет обозреватель firefox :)

madmasles 24-06-2014 19:10 2368013

Цитата:

Цитата А_н_д_р_ей
это будет обозреватель firefox »

Для нее есть FF.au3 (V0.6.0.1b-10)

На autoit-script.ru есть Стол заказов

oz84 30-06-2014 10:00 2370189

Вариант попроще
Код:

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, практически то же самое, что нажать на крестик.

Iska 30-06-2014 10:30 2370202

Цитата:

Цитата oz84
Без 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 2370417

Цитата:

Цитата Iska
Посему как-то так: »

А если окон Firefox больше одного?
Проверил, все окна закрываются, только я оставил один класс ([CLASS:MozillaWindowClass]). Единственный минус (существенный), если в момент запуска скрипта открыто диалоговое окно, например, Настройки ([CLASS:MozillaDialogClass]), то Firefox намертво зависает (у меня).

Iska 01-07-2014 02:15 2370529

Цитата:

Цитата madmasles
А если окон Firefox больше одного? »

Именно поэтому пользуем не WinClose(). Если закрывать «пооконно» — то, при следующем открытии Firefox (если установлено «Показать окна и вкладки, открытые в прошлый раз»), все его окна, окромя последнего будут потеряны.

Цитата:

Цитата madmasles
Единственный минус (существенный), если в момент запуска скрипта открыто диалоговое окно, например, Настройки ([CLASS:MozillaDialogClass]), то Firefox намертво зависает (у меня). »

Я не проверял, но не сомневаюсь. С модальными диалогами тяжко работать — надо предусматривать все возможные «чихи». Сюда же идут запросы по закрытию приложений, запросы сохранения содержимого и т.п.

madmasles 01-07-2014 02:25 2370532

Цитата:

Цитата Iska
Сюда же идут запросы по закрытию приложений, запросы сохранения содержимого и т.п. »

ИМХО, надо изучать FF.au3 (V0.6.0.1b-10) для того, чтобы действительно корректно закрывать Firefox.

Iska 01-07-2014 09:35 2370577

А там нечего изучать — делается опосредованный вызов внутренней функции 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).


Время: 20:47.

Время: 20:47.
© OSzone.net 2001-