<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6238</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6238&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Ищу надёжный способ "нормально" завершать любой процесс».]]></description>
		<lastBuildDate>Tue, 26 Jun 2018 15:50:44 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=126454#p126454</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Tue, 26 Jun 2018 15:50:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=126454#p126454</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=107547#p107547</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Sat, 26 Apr 2014 09:11:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=107547#p107547</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69534#p69534</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Sergij)]]></author>
			<pubDate>Fri, 15 Feb 2013 04:34:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69534#p69534</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69533#p69533</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Sergij)]]></author>
			<pubDate>Fri, 15 Feb 2013 03:59:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69533#p69533</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69515#p69515</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Grey)]]></author>
			<pubDate>Thu, 14 Feb 2013 21:53:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69515#p69515</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=69481#p69481</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Sergij)]]></author>
			<pubDate>Thu, 14 Feb 2013 14:32:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=69481#p69481</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51889#p51889</link>
			<description><![CDATA[<p>Спасибо!!</p>]]></description>
			<author><![CDATA[null@example.com (mih)]]></author>
			<pubDate>Mon, 26 Sep 2011 19:29:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51889#p51889</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51887#p51887</link>
			<description><![CDATA[<p>Наверно, тут ты прав.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 26 Sep 2011 19:27:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51887#p51887</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51882#p51882</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Mon, 26 Sep 2011 19:02:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51882#p51882</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51881#p51881</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Во время ломания все данные сохранились и приложение ждёт пока его убьют.</p></blockquote></div><p>А ведь точно, Александр_, точно!</p>]]></description>
			<author><![CDATA[null@example.com (mih)]]></author>
			<pubDate>Mon, 26 Sep 2011 18:51:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51881#p51881</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51880#p51880</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 26 Sep 2011 17:53:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51880#p51880</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51877#p51877</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Mon, 26 Sep 2011 17:38:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51877#p51877</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51876#p51876</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 26 Sep 2011 17:31:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51876#p51876</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51874#p51874</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Mon, 26 Sep 2011 17:20:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51874#p51874</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Ищу надёжный способ "нормально" завершать любой процесс]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=51872#p51872</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 26 Sep 2011 16:58:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=51872#p51872</guid>
		</item>
	</channel>
</rss>
