<?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=12404&amp;type=atom" />
	<updated>2017-02-09T04:27:36Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=12404</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=112024#p112024" />
			<content type="html"><![CDATA[<div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="quotebox"><cite>stealzy пишет:</cite><blockquote><div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1
Process priority,, High
UpTime := 50, DownTime := 20
SetMouseDelay % DownTime
Return

*$LButton::autoClick(LMBState := True, UpTime)
*$LButton Up::LMBState := False
Esc &amp; LButton::Suspend

autoClick(ByRef LMBState, UpTime) {
	While LMBState {
		Send {vk01}
		Sleep % UpTime
	}
}</code></pre></div></blockquote></div></div></div><p>Попробовал, работает, но SendInput и Sleep работает гораздо стабильнее, чем Send, SetMouseDelay и Sleep в приложении, в котором я использую автокликер. Возможно это каким-то образом связано с тем, что в приложении чувствительность мыши зависит от FPS(я тестирую на ~200 FPS), а также на низком FPS(~24) приходится даже ЛКМ зажимать где-то на 100-200 мс, чтобы стрелять начало(без автокликера).</p><br /><div class="quotebox"><cite>belyankin12 пишет:</cite><blockquote><p>Как мне сравнить скорости конкретно?</p></blockquote></div><div class="quotebox"><cite>stealzy пишет:</cite><blockquote><div class="codebox"><pre><code>start := A_TickCount
; your code
MsgBox % &quot;Time: &quot; A_TickCount - start</code></pre></div></blockquote></div><p>Я заметил, что в некоторых приложениях лучше работает просто Send {click} и Sleep, в других - {click Down}, Sleep, {click Up} и т.д.<br />Еще одним неплохим тестом является видеокамера, чтобы сравнить лаг между физическим нажатием клавиши и моментом, когда видно, что функция в приложении была активирована.</p><p>И еще интересует такой вопрос. Я заметил, что если перебиндить кнопки мыши(в софте от производителя), например, Mouse4 и Mouse5 на Backspace и ALT+Right соответственно(аналоги Mouse4 и Mouse5 в windows, браузерах и т.д.), то при нажатии на кнопки(4,5) мыши, функции(назад, вперед) в Windows и в браузерах активируются гораздо быстрее.<br />Именно поэтому изначально я и забиндил скрипт на отправку &quot;R&quot;, а не ЛКМ.</p><p>Кроме того, в самом AHK существует очень много различных способов отправить нажатие:<br /></p><div class="codebox"><pre><code>

Send {R Down}
Send {vk52 Down} ; R Key
Send {LButton Down}
Send {vk01 Down}
Send {click Down}
Click
Click Down
MouseClick, left
DllCall(&quot;mouse_event&quot;, &quot;UInt&quot;, 0x02) ; left button down
</code></pre></div><p>И еще, наверняка, есть множество способов, о которых я не знаю(дополните список, пожалуйста, кто знает).</p>]]></content>
			<author>
				<name><![CDATA[Anonymous]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34606</uri>
			</author>
			<updated>2017-02-09T04:27:36Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=112024#p112024</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111998#p111998" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1
Process priority,, High
Global UpTime := 20, DownTime := 10
SetMouseDelay % DownTime
Return

*$LButton::autoClick(LMBState := True)
*$LButton Up::LMBState := False
Esc &amp; LButton::Suspend

autoClick(ByRef LMBState) {
	While LMBState {
		Send {vk01}
		Sleep % UpTime
	}
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2017-02-08T15:39:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111998#p111998</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111985#p111985" />
			<content type="html"><![CDATA[<p>Пока сделал так:<br /></p><div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1 ; по умолчанию между командами в скрипте задержка 10 мс
Process, priority, , High ; процесс кликера должен иметь больший приоритет
SendMode Input
SetKeyDelay -1, -1
SetMouseDelay, -1, -1

Global UpTime := 16
Global DownTime := 58

*~vk01::
LMBState := 1
Sleep %DownTime%
Send {vk01 up}
Sleep %UpTime%
LOOP
{
if LMBState = 0
break
Send {click down}
Sleep %DownTime%
Send {click up}
Sleep %UpTime%
}
Return

*~vk01 Up::
{
	LMBState := 0
}
Return</code></pre></div><p>Активация без видимого на глаз лага, кликает стабильно. Разница между стартовым скриптом и этим огромная, первый неиграбельный, проще руками затыкать.</p><p>Всем ответившим спасибо за помощь. Если кто еще знает, как ускорить перехват и нажатие клавиш(а также как ускорить работу конкретно этого скрипта) - пишите, не стесняйтесь.</p>]]></content>
			<author>
				<name><![CDATA[Anonymous]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34606</uri>
			</author>
			<updated>2017-02-08T08:56:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111985#p111985</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111939#p111939" />
			<content type="html"><![CDATA[<p>Моя ошибка, никогда не пользовался задержкой для мыши, надо было брать SetMouseDelay.<br />Вот, кстати, преимущество локального файла справки AutoHotkey.chm: когда я убедился, что задержка не появляется, я открыл SetKeyDelay в справке и увидел, что слева, в списке комманд, за сразу за ней идет SetMouseDelay ;-).</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2017-02-06T10:31:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111939#p111939</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111932#p111932" />
			<content type="html"><![CDATA[<p><strong>stealzy</strong>, переделал так с использованием <em>Send {click up}:</em><br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1 ; по умолчанию между командами в скрипте задержка 10 мс
Process, priority, , High ; процесс кликера должен иметь больший приоритет
SendMode Input
SetKeyDelay 0

Global DownTime := 64
Global UpTime := 10

*vk01::
LMBState := 1
LOOP
{
Send {Click down}
Sleep %DownTime%
Send {Click up}
Sleep %UpTime%
if LMBState = 0
break
}
Return

*~vk01 Up::
{
	LMBState := 0
}
Return</code></pre></div></div></div><div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Либо использовать просто <em>Send {click}</em>, длительность нажатия определяет SetKeyDelay.</p></blockquote></div><p>В <a href="https://autohotkey.com/docs/commands/SetKeyDelay.htm">оф. документации</a> говорится:&quot;Note: SetKeyDelay is not obeyed by SendInput; there is no delay between keystrokes in that mode. This same is true for Send when SendMode Input is in effect&quot;.</p><p>После этого совета переделал так:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1 ; по умолчанию между командами в скрипте задержка 10 мс
Process, priority, , High ; процесс кликера должен иметь больший приоритет
SendMode Input
SetKeyDelay 100, 100 ; Delay, Duration



*vk01::
LMBState := 1
LOOP
{
Send {Click}
if LMBState = 0
break
}
Return

*~vk01 Up::
{
	LMBState := 0
}
Return

numpad8::
{
	SetKeyDelay 500, 500
}
Return

NumpadMult::
MsgBox, KeyDelay: %A_KeyDelay% ms, KeyDuration: %A_KeyDuration% ms
</code></pre></div></div></div><p>Но при &#039;замене&#039; Sleep на SetKeyDelay, SetKeyDelay не имеет никакого эффекта(спам ЛКМ с максимальной скоростью) даже если закомментировать строку <em>;SendMode Input</em> вначале т.е. SetKeyDelay не имеет никакого эффекта вне зависимости от типа ввода.</p><p>Также при попытке изменить SetKeyDelay при помощи хоткея, это не влияет ни на сами Delay и PressDuration, ни на встроенные переменные A_KeyDelay, A_KeyDuration. Например, если запустить последний скрипт, то при нажатии на ЛКМ, кнопка будет спамится с максимальной скоростью(а не 5 нажатий в секунду 100/100), после нажатия на numpad8 не изменится ровным ничего, а при нажатии на NumpadMult показывается данный MsgBox:<br /><span class="postimg"><img src="http://i.imgur.com/eVD2wdx.png" alt="http://i.imgur.com/eVD2wdx.png" /></span></p><p>Разве при нажатии на numpad8 значения переменных A_KeyDelay и A_KeyDuration не должны измениться на 500/500?</p><p>Я никак не могу понять, где я допустил ошибку.</p>]]></content>
			<author>
				<name><![CDATA[Anonymous]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34606</uri>
			</author>
			<updated>2017-02-06T04:38:35Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111932#p111932</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111928#p111928" />
			<content type="html"><![CDATA[<p>За оверквотинг модеры ругаются, первое и последнее цитирования у вас явно лишние, отредактируйте.</p><p>Раз у вас работает, то хорошо, но для порядка можно бы посылать еще и <em>Send {click up}</em>.<br />Либо использовать просто <em>Send {click}</em>, длительность нажатия определяет SetKeyDelay.<br />Как измерять скорость я написал как раз постом выше.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2017-02-05T13:02:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111928#p111928</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111923#p111923" />
			<content type="html"><![CDATA[<p>Переделал вот так:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1 ; по умолчанию между командами в скрипте задержка 10 мс
Process, priority, , High ; процесс кликера должен иметь больший приоритет
SendMode Input
SetKeyDelay 0


*vk01::
LMBState := 1
LOOP
{
Send {click down}
Sleep %UpTime%
if LMBState = 0
break
}
Return

*~vk01 Up::
{
	LMBState := 0
}
Return
</code></pre></div></div></div><p>Вроде верно относительно Ваших рекомендаций.</p><p>Лага при нажатии нет в сравнении с использованием без скрипта(на глаз), клики стабильнее в приложении в сравнении с тем, что было раньше.</p><div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Конфликт, когда вы еще не отпустили кнопку мыши, а скрипт уже начал работу, возможная причина лага.<br />Я бы не пропускал клик дальше скрипта, а цикл начинал с <em>Send {click down}</em>.</p></blockquote></div><p>Мне кажется, что изначально был лаг из-за того, что вначале происходил перехват нажатия клавиши, а потом отправка нажатия другой клавиши, и который был решен модификатором ~ и изменением логики скрипта.</p><p>А разве скрипт ниже не будет работать еще быстрее приведенного выше в данном посте(т.к. оригинальный клик мыши не блокируется, а пропускается)?</p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1 ; по умолчанию между командами в скрипте задержка 10 мс
Process, priority, , High ; процесс кликера должен иметь больший приоритет
SendMode Input
SetKeyDelay 0

*~vk01::
LMBState := 1
Sleep %UpTime%
Send {vk01 Up}
LOOP
{
if LMBState = 0
break
Send {click down}
Sleep %UpTime%
}
Return

*~vk01 Up::
{
	LMBState := 0
}
Return
</code></pre></div></div></div>]]></content>
			<author>
				<name><![CDATA[Anonymous]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34606</uri>
			</author>
			<updated>2017-02-05T12:12:09Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111923#p111923</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111921#p111921" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>start := A_TickCount
; your code
MsgBox % &quot;Time: &quot; A_TickCount - start</code></pre></div><p>У меня скрипты компилируются одной командой. Что вы там подготавливаете?</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2017-02-05T11:50:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111921#p111921</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111914#p111914" />
			<content type="html"><![CDATA[<p>Как мне сравнить скорости конкретно? Если сравнивать по ощущениям, то на это время много уйдет. Кроме того, подготовить мой скрипт для компиляции тоже время займет, потому спрашиваю так.</p>]]></content>
			<author>
				<name><![CDATA[belyankin12]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34408</uri>
			</author>
			<updated>2017-02-05T09:42:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111914#p111914</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111911#p111911" />
			<content type="html"><![CDATA[<p>Задам вопрос, который касается темы, как я думаю, а если не так, то скажите, больше не буду. Собственно, мне говорят, если скрипт компилировать, то его скорость работы увеличивается, так ли это?</p>]]></content>
			<author>
				<name><![CDATA[belyankin12]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34408</uri>
			</author>
			<updated>2017-02-05T08:58:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111911#p111911</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111910#p111910" />
			<content type="html"><![CDATA[<p>Во-первых увеличиваем общую прозводительность:</p><div class="codebox"><pre><code>#NoEnv
#MaxHotkeysPerInterval 200
SetBatchLines -1 ; по умолчанию между командами в скрипте задержка 10 мс
Process, priority, , High ; процесс кликера должен иметь больший приоритет
SendMode Input
SetKeyDelay 0
</code></pre></div><p>Во-вторых, проверять не отжатие клавиши в цикле, а некую переменную.<br />Просто делаем аналогичный хоткей на отжатие клавиши, в нем присваиваем некой переменной значение 1.<br />Конфликт, когда вы еще не отпустили кнопку мыши, а скрипт уже начал работу, возможная причина лага.<br />Я бы не пропускал клик дальше скрипта, а цикл начинал с <em>Send {click down}</em>.</p>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2017-02-05T08:21:39Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111910#p111910</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Самый быстрый способ перехвата, а также отправки нажатий клавиш?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=111901#p111901" />
			<content type="html"><![CDATA[<p>Понадобился автокликер. Вначале набросал код дефолтного автокликера и забиндил на R:<br /></p><div class="codebox"><pre><code>
DownTime := 80
UpTime := 10

*$~vk01:: ; LMB
LOOP
{
Send {vk52 Down} ; R key
Sleep %DownTime%
Send {vk52 Up} ; R key
Sleep %UpTime%

if !GetKeyState(&quot;vk01&quot;, &quot;P&quot;)  ; LMB
break
}
Return</code></pre></div><p>Который работает достаточно быстро в большинстве случаев, но в моем случае нужен более быстрый автокликер. Также были проблемы со стабильностью работы в приложении(в приложении используется raw input) и таймингами, то недостаточно быстро отправлялись нажатия, то наоборот нажатий было слишком много.</p><p>Изменил Send на SendInput, и скрипт начал работать намного более стабильно(на глаз - идеально в плане стабильности и таймингов нажатий), но осталась еще одна серьезная проблема - это задержка при нажатии ЛКМ т.е. при активации скрипта в сравнении с тем, когда скрипт не используется(где-то 50ms разница).</p><p>Заменил бинд с R на ЛКМ в скрипте, а также немного изменил логику работы:<br /></p><div class="codebox"><pre><code>
DownTime := 80
UpTime := 10

*$~vk01::
LOOP
{
Sleep %DownTime%
SendInput {vk01 Up}
Sleep %UpTime%
if !GetKeyState(&quot;vk01&quot;, &quot;P&quot;)
break
SendInput {vk01 Down}
}
Return</code></pre></div><p>Чтобы AHK не блокировал нажатие ЛКМ и функция в приложении активировалась при оригинальном нажатии ЛКМ, а не при помощи скрипта.</p><p>На глаз задержка(лаг активации функции в приложении) при использовании скрипта отстутствует в сравнении с тем, когда скрипт не спользуется, работает стабильно в плане таймингов.</p><p>Но вопрос остался. Знатоки, подскажите, пожалуйста, как можно ускорить работу скрипта: уменьшить время активации скрипта(лаг) и увеличить скорость отправки нажатий(не время между отправкой нажатий)?</p><br /><p>Всем заранее спасибо за советы! <span class="postimg"><img src="http://smiles.kolobanga.ru/standart_koloboks/standart_light_skin/drinks.gif" alt="http://smiles.kolobanga.ru/standart_koloboks/standart_light_skin/drinks.gif" /></span></p>]]></content>
			<author>
				<name><![CDATA[Anonymous]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34606</uri>
			</author>
			<updated>2017-02-04T23:56:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=111901#p111901</id>
		</entry>
</feed>
