<?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>http://forum.script-coding.com/viewtopic.php?id=11769</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=11769&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Отключить скрипт во время набора текста».]]></description>
		<lastBuildDate>Thu, 30 Jun 2016 18:30:18 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105719#p105719</link>
			<description><![CDATA[<p><strong>kamelotto</strong><br />Сам часто пользуюсь скриптами, которые нужны только в определенные моменты, и затем их нужно также по быстрому выключить... Придумал себе такое (Возможно не каждому удобно).</p><p>1) Основной скрипт, в нем прописываю горячие клавиши на запуск нужных мне скриптов (Запускается при запуске Windows).<br />Run.ahk<br /></p><div class="codebox"><pre><code>
SetWorkingDir %A_ScriptDir%
#SingleInstance force
#NoTrayIcon  ; Скрытый режим, чтобы иконка не мозолила глаз :)

F12:: ExitApp  
^F12:: Reload

F11:: Run, Таймер\Timer.ahk ; Запуск скрипта &quot;Таймер&quot;

F10::
Sendinput +{F11} ; (Нажимает Shift + F11) Закроет скрипт &quot;Таймер&quot;, если запущен.
Run, Запись\Rec.ahk ; Запуск скрипта &quot;Запись&quot;

</code></pre></div><p>&nbsp; </p><p>2) Далее в самих скриптах пишу.</p><p>Timer.ahk<br /></p><div class="codebox"><pre><code>
SetWorkingDir %A_ScriptDir% 
Menu, Tray, Icon, Таймер\timer.ico ; Иконка помогает быстро определить какой скрипт запущен 
TrayTip, Таймер, Запущен ; Уведомление тоже не помешает

F11:: ExitApp ; Завершить скрипт

+F11:: ExitApp ; (Shift+F11) Также завершить скрипт. Если необходимо при запуске другого скрипта, завершить этот. 
</code></pre></div><p>Rec.ahk<br /></p><div class="codebox"><pre><code>
SetWorkingDir %A_ScriptDir% 
Menu, Tray, Icon, Запись\Rec.ico 
TrayTip, Запись, Запущена

F10:: ExitApp
</code></pre></div><p>Теперь использование. Нажимаю F11 - запускается скрипт &quot;Таймер&quot;, нажимаю еще раз F11 - закрываю скрипт, и т.п с остальными.</p><p>P.S. Прошу строго не судить, пишу как могу, на основе полученных знаний и собственных экспериментов.</p>]]></description>
			<author><![CDATA[null@example.com (ProgMaster90)]]></author>
			<pubDate>Thu, 30 Jun 2016 18:30:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105719#p105719</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105698#p105698</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Да. Наверное Вы правы. Видимо искусственный интеллект так просто в AHK не написать. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Спасибо вам за труды.&nbsp; Жаль только комментариев маловато. Сижу теперь и пытаюсь сам разобрать, какая строка за что отвечает. Но это уже ....</p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Wed, 29 Jun 2016 22:54:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105698#p105698</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105697#p105697</link>
			<description><![CDATA[<p>Да, не подумал. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Тогда, наверное, лучше остановиться на первом варианте, либо останавливать все нужные скрипты по одной горячей клавише.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 29 Jun 2016 21:24:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105697#p105697</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105696#p105696</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Похоже это не правильный путь. При запущенном отключающем скрипте (назовём его &quot;завершитель&quot;. Тот, который Вы пишете), два других скрипта: &quot;KeySender.ahk&quot;и &quot;KeySender2.ahk&quot; можно загрузить в память и они там будут висеть. Но запустить их выполнение, например&nbsp; нажав Ctrl+P не удаётся. Происходит завершение его и он исчезает из трея. Завершаются оба скрипта, по команде, вызывающей любой из них.</p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Wed, 29 Jun 2016 17:54:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105696#p105696</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105694#p105694</link>
			<description><![CDATA[<p>Попробуйте так:<br /></p><div class="codebox"><pre><code>#Persistent
ScriptNames := [&quot;KeySender.ahk&quot;, &quot;KeySender2.ahk&quot;]  ; имена скриптов, которые нужно завершить
Blocker.Init(ScriptNames)
Return

class Blocker
{
	Init(ScriptNames)  {
		this.ScriptNames := ScriptNames
		this.oWMI := ComObjGet(&quot;winmgmts:&quot;)
		this.hHookKeybd := DllCall(&quot;SetWindowsHookEx&quot;
			, Int, WH_KEYBOARD_LL := 13
			, Ptr, RegisterCallback(&quot;LowLevelKeyboardProc&quot;, &quot;Fast&quot;)
			, Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
			, UInt, 0, Ptr)
	}
	Terminate()  {
		SetTitleMatchMode, 2
		DetectHiddenWindows, On
		for k, name in this.ScriptNames
			if WinExist(name) &amp;&amp; (this.GetLifeTime(name) &gt; 2)  ; закрываем процесс скрипта, если он был создан более двух секунд назад
				WinClose
	}
	GetLifeTime(name)  {
		WinGet, PID, PID, % name
		LifeTime -= this.oWMI.Get(&quot;Win32_Process.Handle=&quot; PID).CreationDate, s
		Return LifeTime
	}
}
	
LowLevelKeyboardProc(nCode, wParam, lParam)
{
	static LLKHF_INJECTED := 0x10, INJECTED, msg
		  , oMsg := {0x100: &quot;WM_KEYDOWN&quot;, 0x101: &quot;WM_KEYUP&quot;, 0x104: &quot;WM_SYSKEYDOWN&quot;, 0x105: &quot;WM_SYSKEYUP&quot;}
	msg  	:= wParam
	flags := NumGet(lParam + 8, &quot;UInt&quot;)
	INJECTED := (flags &amp; LLKHF_INJECTED) &gt;&gt; 4
	SetTimer, EventHandling, -10
	Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
	
EventHandling:
   if InStr(oMsg[msg], &quot;DOWN&quot;) &amp;&amp; !INJECTED
		Blocker.Terminate()
	Return
}</code></pre></div><p>Здесь скрипт завершается, только если был запущен более двух секунд назад.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 29 Jun 2016 17:09:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105694#p105694</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105692#p105692</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />С ним что то не так. Он работает вроде. То есть закрывает указанные скрипты во время введения первого символа текста. Но так же закрывает эти скрипты по команде, их вызывающей, когда мы не работаем в текстовом поле. <br />Видимо команды запуска этих скриптов воспринимаются, как набор текста и поэтому происходит завершение. То есть не получается в дальнейшем запустить отключенные скрипты, когда они понадобились снова. <br />Хм... Похоже первый тупичёк <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Wed, 29 Jun 2016 15:32:02 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105692#p105692</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105690#p105690</link>
			<description><![CDATA[<p>Если завершать несколько скриптов, то так:<br /></p><div class="codebox"><pre><code>#Persistent
ScriptNames := [&quot;KeySender.ahk&quot;, &quot;KeySender2.ahk&quot;]  ; имена скриптов, которые нужно завершить
Blocker.Init(ScriptNames)
Return

class Blocker
{
	Init(ScriptNames)  {
		this.ScriptNames := ScriptNames
		this.hHookKeybd := DllCall(&quot;SetWindowsHookEx&quot;
			, Int, WH_KEYBOARD_LL := 13
			, Ptr, RegisterCallback(&quot;LowLevelKeyboardProc&quot;, &quot;Fast&quot;)
			, Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
			, UInt, 0, Ptr)
	}
	Terminate()  {
		SetTitleMatchMode, 2
		DetectHiddenWindows, On
		for k, v in this.ScriptNames
			if WinExist(v)
				WinClose
	}
}
	
LowLevelKeyboardProc(nCode, wParam, lParam)
{
	static LLKHF_INJECTED := 0x10, INJECTED
	flags := NumGet(lParam + 8, &quot;UInt&quot;)
	INJECTED := (flags &amp; LLKHF_INJECTED) &gt;&gt; 4
	SetTimer, EventHandling, -10
	Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
	
EventHandling:
   if !INJECTED
		Blocker.Terminate()
	Return
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 29 Jun 2016 14:28:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105690#p105690</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105686#p105686</link>
			<description><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Выключить совсем — в смысле, завершить?</p></blockquote></div><p>Наверное да. В случае чего потом запускать снова. И ещё сразу....<br />Как можно указать несколько скриптов в обоих вариантах?</p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Wed, 29 Jun 2016 12:34:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105686#p105686</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105685#p105685</link>
			<description><![CDATA[<p>Выключить совсем — в смысле, завершить?</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 29 Jun 2016 12:30:57 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105685#p105685</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105684#p105684</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Спасибо. Это интересное решение. И похоже оно работает. Буду тестировать. <br />Вариант с приостановкой скрипта, это удобно. <br />Однако было бы не плохо, ещё иметь возможность выключить его совсем, с момента набора текста. Бывают такие скрипты, которые просто висят в памяти и редко используются. Их можно и совсем отключить, когда дело доходит до текста. Скажем переписка в соцсети. Это, как правило надолго, и скрипты могут мешать, и как то понятно, что они долго не понадобятся, если началась переписка.</p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Wed, 29 Jun 2016 12:14:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105684#p105684</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105682#p105682</link>
			<description><![CDATA[<p>Скрипт, посылающий нажатия:<br /></p><div class="codebox"><pre><code>^vk50::  ; Ctrl + P
	SetTimer, SendKey, % (i := !i) ? &quot;On&quot; : &quot;Off&quot;
	Return

SendKey:
	if !GetKeyState(&quot;Ctrl&quot;, &quot;P&quot;)
		SendInput, {!}
	Return</code></pre></div><p>Скрипт, блокирующий первый скрипт:<br /></p><div class="codebox"><pre><code>#Persistent
ScriptName := &quot;KeySender.ahk&quot;  ; имя скрипта, который нужно поставить на паузу
BlockPeriod := 3000        ; время, на которое нужно остановить скрипт
Blocker.Init(ScriptName, BlockPeriod)
Return

class Blocker
{
	Init(ScriptName, time)  {
		this.ScriptName := ScriptName
		this.BlockTime := time
		this.UnBlock := this.UnBlockTimer.Bind(this)
		this.hHookKeybd := DllCall(&quot;SetWindowsHookEx&quot;
			, Int, WH_KEYBOARD_LL := 13
			, Ptr, RegisterCallback(&quot;LowLevelKeyboardProc&quot;, &quot;Fast&quot;)
			, Ptr, DllCall(&quot;GetModuleHandle&quot;, UInt, 0, Ptr)
			, UInt, 0, Ptr)
	}
	Block()  {
		if !hWnd := this.GetScriptMainWindow()
			Return
		if !this.Blocked  {
			this.Blocked := 1
			WinMenuSelectItem, % &quot;ahk_id&quot; hWnd,, 1&amp;, 5&amp;
		}
		timer := this.UnBlock
		SetTimer, % timer, % &quot;-&quot; this.BlockTime
	}
	UnBlockTimer()  {
		WinMenuSelectItem, % &quot;ahk_id&quot; this.GetScriptMainWindow(),, 1&amp;, 5&amp;
		this.Blocked := 0
	}
	GetScriptMainWindow()  {
		SetTitleMatchMode, 2
		DetectHiddenWindows, On
		Return WinExist(this.ScriptName)
	}
}
	
LowLevelKeyboardProc(nCode, wParam, lParam)
{
	static LLKHF_INJECTED := 0x10, INJECTED
	flags := NumGet(lParam + 8, &quot;UInt&quot;)
	INJECTED := (flags &amp; LLKHF_INJECTED) &gt;&gt; 4
	SetTimer, EventHandling, -10
	Return DllCall(&quot;CallNextHookEx&quot;, Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
	
EventHandling:
   if !INJECTED
		Blocker.Block()
	Return
}</code></pre></div><p>Сохраняем первый скрипт, как KeySender.ahk. Запускаем его. Потом запускаем второй скрипт. Открываем блокнот, нажимаем Ctrl + P (старт посыла клавиш), и посылающий скрипт через время, указанное во втором скрипте (3000 мс), начинает отправлять в блокнот клавишу {!}. Пробуем что-нибудь напечатать. После каждого физического нажатия клавиш посылающий скрипт должен ставиться на паузу на 3 секунды.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 29 Jun 2016 11:43:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105682#p105682</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105681#p105681</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Буду ждать <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Wed, 29 Jun 2016 09:55:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105681#p105681</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105649#p105649</link>
			<description><![CDATA[<p>Тогда завтра напишу.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 28 Jun 2016 11:08:13 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105649#p105649</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105646#p105646</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />А что? Это тоже мысль. Нужно только на практике попробовать, как это будет в пользовании.</p>]]></description>
			<author><![CDATA[null@example.com (kamelotto)]]></author>
			<pubDate>Tue, 28 Jun 2016 10:49:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105646#p105646</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=105643#p105643</link>
			<description><![CDATA[<p>Да, определить наличие каретки можно не всегда. Как вариант могу предложить блокировать указанный скрипт на какое-то время после физического нажатия любой клавиши на клавиатуре.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 28 Jun 2016 09:09:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=105643#p105643</guid>
		</item>
	</channel>
</rss>
