<?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="http://forum.script-coding.com/extern.php?action=feed&amp;tid=11769&amp;type=atom" />
	<updated>2016-06-30T18:30:18Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=11769</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105719#p105719" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[ProgMaster90]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=33925</uri>
			</author>
			<updated>2016-06-30T18:30:18Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105719#p105719</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105698#p105698" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />Да. Наверное Вы правы. Видимо искусственный интеллект так просто в AHK не написать. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Спасибо вам за труды.&nbsp; Жаль только комментариев маловато. Сижу теперь и пытаюсь сам разобрать, какая строка за что отвечает. Но это уже ....</p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-29T22:54:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105698#p105698</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105697#p105697" />
			<content type="html"><![CDATA[<p>Да, не подумал. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Тогда, наверное, лучше остановиться на первом варианте, либо останавливать все нужные скрипты по одной горячей клавише.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-29T21:24:50Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105697#p105697</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105696#p105696" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />Похоже это не правильный путь. При запущенном отключающем скрипте (назовём его &quot;завершитель&quot;. Тот, который Вы пишете), два других скрипта: &quot;KeySender.ahk&quot;и &quot;KeySender2.ahk&quot; можно загрузить в память и они там будут висеть. Но запустить их выполнение, например&nbsp; нажав Ctrl+P не удаётся. Происходит завершение его и он исчезает из трея. Завершаются оба скрипта, по команде, вызывающей любой из них.</p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-29T17:54:49Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105696#p105696</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105694#p105694" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-29T17:09:04Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105694#p105694</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105692#p105692" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />С ним что то не так. Он работает вроде. То есть закрывает указанные скрипты во время введения первого символа текста. Но так же закрывает эти скрипты по команде, их вызывающей, когда мы не работаем в текстовом поле. <br />Видимо команды запуска этих скриптов воспринимаются, как набор текста и поэтому происходит завершение. То есть не получается в дальнейшем запустить отключенные скрипты, когда они понадобились снова. <br />Хм... Похоже первый тупичёк <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-29T15:32:02Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105692#p105692</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105690#p105690" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-29T14:28:34Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105690#p105690</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105686#p105686" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>teadrinker пишет:</cite><blockquote><p>Выключить совсем — в смысле, завершить?</p></blockquote></div><p>Наверное да. В случае чего потом запускать снова. И ещё сразу....<br />Как можно указать несколько скриптов в обоих вариантах?</p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-29T12:34:39Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105686#p105686</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105685#p105685" />
			<content type="html"><![CDATA[<p>Выключить совсем — в смысле, завершить?</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-29T12:30:57Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105685#p105685</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105684#p105684" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />Спасибо. Это интересное решение. И похоже оно работает. Буду тестировать. <br />Вариант с приостановкой скрипта, это удобно. <br />Однако было бы не плохо, ещё иметь возможность выключить его совсем, с момента набора текста. Бывают такие скрипты, которые просто висят в памяти и редко используются. Их можно и совсем отключить, когда дело доходит до текста. Скажем переписка в соцсети. Это, как правило надолго, и скрипты могут мешать, и как то понятно, что они долго не понадобятся, если началась переписка.</p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-29T12:14:55Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105684#p105684</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105682#p105682" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-29T11:43:21Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105682#p105682</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105681#p105681" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />Буду ждать <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-29T09:55:34Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105681#p105681</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105649#p105649" />
			<content type="html"><![CDATA[<p>Тогда завтра напишу.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-28T11:08:13Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105649#p105649</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105646#p105646" />
			<content type="html"><![CDATA[<p><strong>teadrinker</strong><br />А что? Это тоже мысль. Нужно только на практике попробовать, как это будет в пользовании.</p>]]></content>
			<author>
				<name><![CDATA[kamelotto]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34003</uri>
			</author>
			<updated>2016-06-28T10:49:16Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105646#p105646</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Отключить скрипт во время набора текста]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=105643#p105643" />
			<content type="html"><![CDATA[<p>Да, определить наличие каретки можно не всегда. Как вариант могу предложить блокировать указанный скрипт на какое-то время после физического нажатия любой клавиши на клавиатуре.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2016-06-28T09:09:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=105643#p105643</id>
		</entry>
</feed>
