<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6238&amp;type=atom" />
	<updated>2018-06-26T15:50:44Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=6238</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=126454#p126454" />
			<content type="html"><![CDATA[<p>Экспериментальным путем получился такой код:<br /></p><div class="codebox"><pre><code>;DetectHiddenWindows,On
SetTitleMatchMode,2



v:=CorrectCloseProcess(&quot;ahk_exe notepad.exe&quot;)
;v:=CorrectCloseProcess(&quot;Блокнот&quot;)
msgbox,% &quot;Попыток закрытия: &quot; v



CorrectCloseProcess(WinTitle)
{
  loop,50
  {
    a++
    t:=a_tickcount
    SendMessage,WM_QUERYENDSESSION:=0x11,0,1,,% WinTitle
    d:=a_tickcount-t
    if (d&gt;100)
      return -1
    b:=ErrorLevel
    SendMessage,WM_CLOSE:=0x10,,,,% WinTitle
    if (b=&quot;FAIL&quot;)
      return a
    sleep,10
  }
}
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2018-06-26T15:50:44Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=126454#p126454</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=107547#p107547" />
			<content type="html"><![CDATA[<p>По итогам обсуждения сделал код, эмулирующий сообщения системы процессу при выключении, предлагаю топикстартеру вынести в топ:</p><div class="codebox"><pre><code>DetectHiddenWindows, On
windowID := WinExist(&quot;AHK_class Notepad&quot;) ; Окно вашего приложения

WinGet, procPID, PID, AHK_id %windowID%
SendMessage, WM_QUERYENDSESSION := 0x11,, 1,, AHK_id %windowID%
if ErrorLevel = 1
{
    PostMessage, WM_ENDSESSION := 0x16, 1,,, AHK_id %windowID%
    Sleep 5000
    Process, Close, %procPID%
} else {
    MsgBox, 4132, Внимание!, Приложение не отвечает`, закрыть его аварийно?, 5
    IfMsgBox Timeout
        PostMessage, WM_QUIT := 0x12,,,, AHK_id %windowID% ; или Process, Close, %procPID%
    IfMsgBox Yes
        PostMessage, WM_QUIT := 0x12,,,, AHK_id %windowID% ; или Process, Close, %procPID%
    Else
        SendMessage, WM_QUERYENDSESSION := 0x11,, 0,, AHK_id %windowID%
} 
; чистим Tray от оставшихся иконок, кому надо</code></pre></div><p>Можно оформить в виде функции и радоваться.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2014-04-26T09:11:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=107547#p107547</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69534#p69534" />
			<content type="html"><![CDATA[<p>Вроде нашел проблему, хотя не до конца все ясно.<br />У меня установлен Comodo Internet Security, я отключил всю его защиту и скрипт заработал, а после того как снова включил защиту, скрипт продолжает работать. <br />Возможно комодо уже принял AHK за своего. Как сразу не догадался <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />И даже ваш вариант (как наиболее мне непонятный <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /> ) тоже работает.<br />Спасибо</p>]]></content>
			<author>
				<name><![CDATA[Sergij]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29625</uri>
			</author>
			<updated>2013-02-15T04:34:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69534#p69534</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69533#p69533" />
			<content type="html"><![CDATA[<p>Так тоже не работает выдает ошибку на строке №5<br /></p><div class="codebox"><pre><code>   If (oWMI:=ComObjGet(&quot;winmgmts:&quot;).ExecQuery(query)).Count
</code></pre></div><p>Пробовал так <br /></p><div class="codebox"><pre><code>PostMessage, 0x12,,,, Калькулятор   ; WM_QUIT = 0x12</code></pre></div><p>Не работает</p><p>Попробовал сегодня на другом компе вышеприведенные примеры, вроде все работает,&nbsp; Там Windows 7&nbsp; 32.</p><p>Также пробовал режим совместимости с Windows XP для AHK выставить, один раз сработал taskkill, больше не работал.<br />Пробовал скачивать AHK 64 бит AutoHotkey_Lw64.zip не помогает.</p>]]></content>
			<author>
				<name><![CDATA[Sergij]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29625</uri>
			</author>
			<updated>2013-02-15T03:59:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69533#p69533</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69515#p69515" />
			<content type="html"><![CDATA[<p>А так работает?:</p><div class="codebox"><pre><code>app:=&quot;calc.exe&quot;
query:=&quot;SELECT Name FROM Win32_Process WHERE Name=&#039;&quot;app &quot;&#039;&quot;

F4::
   If (oWMI:=ComObjGet(&quot;winmgmts:&quot;).ExecQuery(query)).Count
      For colItem In oWMI
         colItem.Terminate
   Else MsgBox, 262144, % A_Space, % &quot;Not found&quot;, 1
   KeyWait, % A_ThisHotkey
   oWMI:=colItem:=&quot;&quot;
   Return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Grey]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=25792</uri>
			</author>
			<updated>2013-02-14T21:53:11Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69515#p69515</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69481#p69481" />
			<content type="html"><![CDATA[<p>Хотел сделать простенький код для убивания - завершения любого приложения по горячей кнопке , для начала попробовал. <br /></p><div class="codebox"><pre><code>
f4::
Process, Close, calc.exe
RunWait taskkill /im calc.exe
return
</code></pre></div><p>Не завершает</p><p>taskkill тоже не помогает, если вести команду в командной строке DOS отлично работает, если через AHK RunWait то выдает на секунду окно,<br />недостаточно памяти для завершения операции,&nbsp; и ноль эффекта</p><p>Единственное что сработало это<br /></p><div class="codebox"><pre><code>
Run, calc.exe, , , process_id
Sleep 1000
Process, Close, %process_id%
</code></pre></div><p>А вот это уже не в какую<br /></p><div class="codebox"><pre><code>
Process, Exist, calc.exe
pid=%ErrorLevel%
Process, Close, %pid%
</code></pre></div><p>Может глюки в системе Windows 7 64bit</p>]]></content>
			<author>
				<name><![CDATA[Sergij]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=29625</uri>
			</author>
			<updated>2013-02-14T14:32:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69481#p69481</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51889#p51889" />
			<content type="html"><![CDATA[<p>Спасибо!!</p>]]></content>
			<author>
				<name><![CDATA[mih]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24883</uri>
			</author>
			<updated>2011-09-26T19:29:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51889#p51889</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51887#p51887" />
			<content type="html"><![CDATA[<p>Наверно, тут ты прав.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2011-09-26T19:27:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51887#p51887</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51882#p51882" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Во всяком случае, блокнот с несохранённым текстом выдаёт &quot;FAIL&quot;.</p></blockquote></div><p>Наверно таймаут. При реальном выходе из системы тут как раз и должно появиться сообщение о том, что приложение зависло и предложение убить его.<br /></p><div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>И зачем три, когда подходит только один? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><p>Если приложение получает сообщение WM_QUERYENDSESSION, то оно должно получить и WM_ENDSESSION. Например для прокси-сервера вполне логично такое поведение: при получении WM_QUERYENDSESSION сохраняем настройки и перестаём устанавливать новые соединения, обрабатывая только уже имеющиеся. Теперь если не послать ему сообщение WM_ENDSESSION с отменой приказа о прекращении работы, то мы получим некорректно функционирующую программу.</p>]]></content>
			<author>
				<name><![CDATA[Александр_]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24888</uri>
			</author>
			<updated>2011-09-26T19:02:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51882#p51882</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51881#p51881" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Во время ломания все данные сохранились и приложение ждёт пока его убьют.</p></blockquote></div><p>А ведь точно, Александр_, точно!</p>]]></content>
			<author>
				<name><![CDATA[mih]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24883</uri>
			</author>
			<updated>2011-09-26T18:51:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51881#p51881</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51880#p51880" />
			<content type="html"><![CDATA[<p>Не нужно цитировать предыдущий пост целиком.<br /></p><div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><p>если приложение не готово завершится, то там будет ноль(FALSE). А &quot;FAIL&quot; говорит о том, что сообщение не было отправлено. по хорошему там нужно три варианта учитывать</p></blockquote></div><p>Во всяком случае, блокнот с несохранённым текстом выдаёт &quot;FAIL&quot;. И зачем три, когда подходит только один? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />И вместо<br /></p><div class="codebox"><pre><code>WinGet pid, pid, ahk_id %hWnd%
hproc:=DllCall(&quot;OpenProcess&quot;, &quot;int&quot;, 0x0001,&quot;int&quot; , 0, &quot;int&quot;, pid)
DllCall(&quot;TerminateProcess&quot;, &quot;int&quot;, hproc, &quot;int&quot;, -1)</code></pre></div><p>проще<br /></p><div class="codebox"><pre><code>Process, Close, [Имя процесса]</code></pre></div><p>ведь имя известно.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2011-09-26T17:53:45Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51880#p51880</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51877#p51877" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Не правильно<br /></p><div class="codebox"><pre><code>if ErrorLevel</code></pre></div><p>т. к. если приложение не готово завершаться, ErrorLevel будет равен &quot;FAIL&quot;, и условие выполнится всё равно.<br />Правильно, как в примере выше<br /></p><div class="codebox"><pre><code>if ErrorLevel = 1</code></pre></div></blockquote></div><p>если приложение не готово завершится, то там будет ноль(FALSE). А &quot;FAIL&quot; говорит о том, что сообщение не было отправлено. по хорошему там нужно три варианта учитывать, но я в примере ошибки намерено не отлавливал, чтобы показать механизм.</p>]]></content>
			<author>
				<name><![CDATA[Александр_]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24888</uri>
			</author>
			<updated>2011-09-26T17:38:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51877#p51877</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51876#p51876" />
			<content type="html"><![CDATA[<p>Не правильно<br /></p><div class="codebox"><pre><code>if ErrorLevel</code></pre></div><p>т. к. если приложение не готово завершаться, ErrorLevel будет равен &quot;FAIL&quot;, и условие выполнится всё равно.<br />Правильно, как в примере выше<br /></p><div class="codebox"><pre><code>if ErrorLevel = 1</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2011-09-26T17:31:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51876#p51876</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51874#p51874" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>Александр_</strong>, а как тогда закрывается Блокнот при завершении сеанса? Или он не реагирует только на эти сообщения посланные лично ему, а те же, но широковещательные — обрабатывает?</p></blockquote></div><p>Примерный механизм с оконными приложениями:<br />1) Приложению посылается сообщение WM_QUERYENDSESSION с кодом ENDSESSION_LOGOFF. Точнее всем потокам процесса, имеющим цикл выборки. Заведует процессом оповещения csrss.exe.<br />2.1) Приложение возвращает TRUE, подтвердив готовность завершить работу.<br />2.2) Приложение возвращает FALSE.<br />3.1) Приложению посылается сообщение WM_ENDSESSION с WPARAM=TRUE. Во время обработки этого сообщения все данные должны быть сохранены. Если приложение не завершится само, то будет убито системой без предупреждения. На размышление даётся HKEY_CURRENT_USER\Control Panel\Desktop\HungAppTimeout или 5000 миллисекунд(по крайней мере в XP так было).<br />3.2) Приложению посылается сообщение WM_ENDSESSION с WPARAM=FALSE. Выключения не будет, отбой тревоги <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> .<br /></p><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>Можно примерчик результативного применения этих сообщений (или хоть табличку увидеть: &quot;Убить их?&quot;)?</p></blockquote></div><div class="codebox"><pre><code>DetectHiddenWindows, On 
WM_QUERYENDSESSION:=0x11
WM_ENDSESSION     :=0x16
ENDSESSION_LOGOFF :=0x80000000

hWnd:=DllCall(&quot;FindWindowA&quot;,&quot;str&quot;,&quot;имя класса&quot;,&quot;str&quot;,&quot;заголовок окна&quot;)
WinGet pid, pid, ahk_id %hWnd%
SendMessage WM_QUERYENDSESSION, 0, ENDSESSION_LOGOFF, , ahk_id %hWnd%
if ErrorLevel
{
   SendMessage WM_ENDSESSION, 1, ENDSESSION_LOGOFF, , ahk_id %hWnd%
   hproc:=DllCall(&quot;OpenProcess&quot;, &quot;int&quot;, 0x0001,&quot;int&quot; , 0, &quot;int&quot;, pid)
   DllCall(&quot;TerminateProcess&quot;, &quot;int&quot;, hproc, &quot;int&quot;, -1)
}
else
{
   SendMessage WM_ENDSESSION, 0, ENDSESSION_LOGOFF, , ahk_id %hWnd%
   MsgBox приложение послало нас ...
}</code></pre></div><div class="quotebox"><cite>mih пишет:</cite><blockquote><p>(точнее, handycache как-то хитро ломается, но не закрывается&nbsp; — это точно)</p></blockquote></div><p>скорее всего:<br />1) Во время ломания все данные сохранились и приложение ждёт пока его убьют.<br />2) Не тому окну отправили сообщение.</p>]]></content>
			<author>
				<name><![CDATA[Александр_]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24888</uri>
			</author>
			<updated>2011-09-26T17:20:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51874#p51874</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=51872#p51872" />
			<content type="html"><![CDATA[<p>Вот так можно:<br /></p><div class="codebox"><pre><code>SendMessage, WM_QUERYENDSESSION := 0x11,, 1,, Безымянный
if ErrorLevel = 1
{
   SendMessage, WM_ENDSESSION := 0x16, 1,,, Безымянный
   Process, Close, notepad.exe
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2011-09-26T16:58:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=51872#p51872</id>
		</entry>
</feed>
