<?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=7324&amp;type=atom" />
	<updated>2012-07-09T23:08:29Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=7324</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61475#p61475" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Grey пишет:</cite><blockquote><p>Я так концовку предложения понял, что нужно знать, сколько времени прошло с момента предыдущего отжатия этой клавиши в момент её текущего отжатия:</p><div class="codebox"><pre><code>SetFormat, Float, 0.3 ; выставляем число знаков после запятой
ReleaseTime:=A_TickCount ; чтобы переменная не была пустой, присвоим ей значение,...
; ...тем самым при первом отжатии у нас будет показатель времени с момента запуска скрипта

vk52:: ; r
   StartTime:=A_TickCount ; присваиваем переменной текущее время
   KeyWait, % A_ThisHotkey ; тут понятно, что происходит...
   OldReleaseTime:=ReleaseTime ; присваиваем переменной время с предыдущего отжатия,...
   ReleaseTime:=A_TickCount ; ...а этой время текущего отжатия
   ; (A_TickCount-StartTime)/1000 собственно тоже самое, что и A_TimeSinceThisHotkey/1000
   TrayTip,, % &quot;время с момента нажатия:`t`t&quot;(A_TickCount-StartTime)/1000
          . &quot;`nвремя с момента предыдущего отжатия:`t&quot;(ReleaseTime-OldReleaseTime)/1000
   Return</code></pre></div></blockquote></div><p>Спасибо. Это то, что мне нужно.</p><div class="quotebox"><cite>Grey пишет:</cite><blockquote><p>Я так концовку предложения понял, что нужно знать, сколько времени прошло с момента предыдущего отжатия этой клавиши в момент её текущего отжатия</p></blockquote></div><p>В конечном итоге мне нужно измерять время между нажатием и отпусканием; между предыдущим отпусканием и текущим нажатием; между предыдущим отпусканием и текущим откусканием клавиши... И это все нужно мерять между разными хоткеями. Поэтому, ИМХО, A_TimeSinceThisHotKey не очень удобно.</p><p>Понял насчет клавиатуры и мыши, автоповтора нажатия и т.д. Спасибо всем за разъяснения и советы.</p>]]></content>
			<author>
				<name><![CDATA[sergeant.coolagin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25809</uri>
			</author>
			<updated>2012-07-09T23:08:29Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61475#p61475</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61445#p61445" />
			<content type="html"><![CDATA[<p>Клавиатура с автоповтором (сделано для удобства ввода большого количества одинаковых символов), у мыши автоповтора нет.</p><div class="quotebox"><cite>sergeant.coolagin пишет:</cite><blockquote><p>...Q нажмется лишь один раз после зажатия правой кнопки мыши, а не будет нажиматься до тех пор, пока я не отпущу правую кнопку мыши.</p></blockquote></div><p>Следовательно Вам нужен некий цикл, и проверка состояния клавиши:</p><div class="codebox"><pre><code>SetKeyDelay, 250

RButton::
   While, GetKeyState(A_ThisHotkey, &quot;P&quot;)
      Send, {vk51} ; q
   Return</code></pre></div><div class="codebox"><pre><code>RButton::
   While, GetKeyState(A_ThisHotkey, &quot;P&quot;)
   {
      Send, {vk51} ; q
      Sleep, 250
   }
   Return</code></pre></div><div class="codebox"><pre><code>RButton::
   Loop
   {
      Send, {vk51} ; q
      Sleep, 250
      If !GetKeyState(A_ThisHotkey, &quot;P&quot;)
         Break
   }
   Return</code></pre></div><div class="quotebox"><cite>sergeant.coolagin пишет:</cite><blockquote><p>Мне нужно измерять время не только сколько кнопка зажата, но и сколько она была отпущенна.</p></blockquote></div><p>Я так концовку предложения понял, что нужно знать, сколько времени прошло с момента предыдущего отжатия этой клавиши в момент её текущего отжатия:</p><div class="codebox"><pre><code>SetFormat, Float, 0.3 ; выставляем число знаков после запятой
ReleaseTime:=A_TickCount ; чтобы переменная не была пустой, присвоим ей значение,...
; ...тем самым при первом отжатии у нас будет показатель времени с момента запуска скрипта

vk52:: ; r
   StartTime:=A_TickCount ; присваиваем переменной текущее время
   KeyWait, % A_ThisHotkey ; тут понятно, что происходит...
   OldReleaseTime:=ReleaseTime ; присваиваем переменной время с предыдущего отжатия,...
   ReleaseTime:=A_TickCount ; ...а этой время текущего отжатия
   ; (A_TickCount-StartTime)/1000 собственно тоже самое, что и A_TimeSinceThisHotkey/1000
   TrayTip,, % &quot;время с момента нажатия:`t`t&quot;(A_TickCount-StartTime)/1000
          . &quot;`nвремя с момента предыдущего отжатия:`t&quot;(ReleaseTime-OldReleaseTime)/1000
   Return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Grey]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25792</uri>
			</author>
			<updated>2012-07-09T05:45:44Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61445#p61445</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61442#p61442" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>creature.ws пишет:</cite><blockquote><p>Работает так, это вам кажется, что «не работает».</p><p>Нажали вы клавишу, перехватилось autohotkey-ем это событие, выполнилась подпрограмма от T:: до return, продолжаете удерживать клавишу — продолжают «клавиатурой» отправляться нажатия, продолжает выполняться подпрограмма от T:: до return, отпускаете клавишу выполняется подпрограмма от T Up:: до return, видите время прошедшее с момента перехвата отправленного нажатия до момента перехвата отправленного «отпускания».</p><p>Возможно, стоит таки обратить внимание на пример из сообщения #3.</p></blockquote></div><p>Ок. Теперь понял. Я предполагал такое и это вписывается в логику. Но тогда почему, например, вот тут:<br /></p><div class="codebox"><pre><code>RBUTTON::
{
Send {Q}
}
return</code></pre></div><p>Подпрограмма выполнится лишь один раз. Т.е. кнопка Q нажмется лишь один раз после зажатия правой кнопки мыши, а не будет нажиматься до тех пор, пока я не отпущу правую кнопку мыши. Точно так же, как и эта программа нажмет кнопку Q только один раз:<br /></p><div class="codebox"><pre><code>RBUTTON::
{
Send {Q Down}
sleep, 50
Send {Q Up}
}
return</code></pre></div><div class="quotebox"><cite>creature.ws пишет:</cite><blockquote><p>Возможно, стоит таки обратить внимание на пример из сообщения #3.</p></blockquote></div><p>Я сразу обратил внимание и попробовал. A_TimeSinceThisHotkey работает отлично. Спасибо вам за подсказки.<br />Но мне все равно интересно, как же все-таки записать значение теперешнего времени только один раз, сразу после нажатия. Подскажите, пожалуйста, как мне это сделать.<br />Мне нужно измерять время не только сколько кнопка зажата, но и сколько она была отпущенна.<br />Только что пришло в голову. Надо будет попробовать так:<br /></p><div class="codebox"><pre><code>vk52::
start_time := A_TickCount
KeyWait, vk52
UpTime := A_TickCount
Return</code></pre></div><div class="quotebox"><cite>Irbis пишет:</cite><blockquote><p><strong>creature.ws</strong>, бывают такие случаи, когда человек не хочет понять доносимой ему мысли...<br />Тогда проще дать готовый пример, если уж есть желание помочь. А лучше просто &quot;забить&quot; на это дело.<br /></p><div class="codebox"><pre><code>vk52::
   KeyWait, % A_ThisHotkey
   if (A_TimeSinceThisHotkey &lt; 150) ; 50мс маловато, ИМХО
   {
; Выполнить этот участок кода
   }
   else
   {
; Выполнить этот участок кода
   }
return</code></pre></div></blockquote></div><p>В данном случае человек не не хочет, а не может.<br />Готовый пример это хорошо, но гораздо эффективнее объяснить принцип.<br />Ну и, конечно же, гораздо проще забить.<br />Меня сбило с толку то, что кнопки жмутся лишь один раз. И я думал, что время запишется тоже только один раз. А как оказалось, подпрограмма зацикливается. Но мне до сих пор непонятно, почему кнопки жмутся лишь один раз, а время записывается циклично до того как отпустишь клавишу, а не один раз сразу после нажатия, как в случае с нажатием кнопок.</p>]]></content>
			<author>
				<name><![CDATA[sergeant.coolagin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25809</uri>
			</author>
			<updated>2012-07-09T00:44:42Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61442#p61442</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61391#p61391" />
			<content type="html"><![CDATA[<p><strong>creature.ws</strong>, бывают такие случаи, когда человек не хочет понять доносимой ему мысли...<br />Тогда проще дать готовый пример, если уж есть желание помочь. А лучше просто &quot;забить&quot; на это дело.<br /></p><div class="codebox"><pre><code>vk52::
   KeyWait, % A_ThisHotkey
   if (A_TimeSinceThisHotkey &lt; 150) ; 50мс маловато, ИМХО
   {
; Выполнить этот участок кода
   }
   else
   {
; Выполнить этот участок кода
   }
return</code></pre></div><p>(Есть подозрение, что если повесить хоткей на R, и не использовать вирт.коды, то следующая тема будет &quot;АНК: помогите, хоткей то работает, то нет&quot;) <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2012-07-05T19:08:09Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61391#p61391</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61390#p61390" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Почему не работает вот так?</p></blockquote></div><p>Работает так, это вам кажется, что «не работает».</p><p>Нажали вы клавишу, перехватилось autohotkey-ем это событие, выполнилась подпрограмма от T:: до return, продолжаете удерживать клавишу — продолжают «клавиатурой» отправляться нажатия, продолжает выполняться подпрограмма от T:: до return, отпускаете клавишу выполняется подпрограмма от T Up:: до return, видите время прошедшее с момента перехвата отправленного нажатия до момента перехвата отправленного «отпускания».</p><p>Возможно, стоит таки обратить внимание на пример из сообщения #3.</p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2012-07-05T17:38:39Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61390#p61390</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61388#p61388" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>creature.ws пишет:</cite><blockquote><p>Зачем вы используете фигурные скобки для выделения части подпрограммы горячей клавиши?<br />Фигурные скобки там не требуются.<br />Значения не «рандомные», а соответствующие описанному алгоритму.<br />Если вы желаете видеть «длительность физического нажатия клавиши» используйте<strong> KeyWait</strong> и <strong>A_TimeSinceThisHotkey</strong>.</p></blockquote></div><p>Без фигурных скобок такой же резильтат.<br />Вообще-то мне нужно в конечном итоге считать длительность физического нажатия клавиши, а так же сколько времени клавиша была в отпущенном состоянии.</p><p>Почему не работает вот так?<br /></p><div class="codebox"><pre><code>T::
StartTime := A_TickCount
Return

T Up::
UpTime := A_TickCount
ElapsedTime := UpTime - StartTime
MsgBox,  %ElapsedTime% milliseconds have elapsed.
Return</code></pre></div><p>В <a href="http://www.script-coding.com/AutoHotkey/Variables.1.0.46.07.html">описании</a> написано:<br /></p><div class="quotebox"><blockquote><p>A_TickCount - Количество миллисекунд, прошедшее со времени перезагрузки компьютера. Сохранив значение A_TickCount в переменной, можно позднее измерить общее время работы. Для этого необходимо вычесть значение этой переменной из последнего значения A_TickCount. Например:<br />start_time := A_TickCount<br />Sleep, 1000<br />elapsed_time := A_TickCount - start_time<br />MsgBox, прошло %elapsed_time% миллисекунд.<br />Переменная A_TickCount округляется до 10 мс. Округление управляется командой QueryPerformanceCounter().</p></blockquote></div><p>Если просто выводить значение переменной A_TickCount по хоткею, то значение выводится корректно.<br />Почему не хочет измерять время нажатия клавиши?<br />Вроде все правильно. По нажатию на кнопку записать в переменную текущее время в милисекундах. По отпусканию клавиши записать текущее время в другую переменную и вычесть из этой переменной предыдущую. Полученное значение и будет равняться длительности физического нажатия клавиши.<br />Почему не хочет работать корректно?</p>]]></content>
			<author>
				<name><![CDATA[sergeant.coolagin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25809</uri>
			</author>
			<updated>2012-07-05T17:04:53Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61388#p61388</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61387#p61387" />
			<content type="html"><![CDATA[<p>Зачем вы используете фигурные скобки для выделения части подпрограммы горячей клавиши?<br />Фигурные скобки там не требуются.<br />Значения не «рандомные», а соответствующие описанному алгоритму.<br />Если вы желаете видеть «длительность физического нажатия клавиши» используйте<strong> KeyWait</strong> и <strong>A_TimeSinceThisHotkey</strong>.</p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2012-07-05T16:40:24Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61387#p61387</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61386#p61386" />
			<content type="html"><![CDATA[<p>Я что-то неправильно понимаю или?.. Почему не работает вот так?<br /></p><div class="codebox"><pre><code>T::
{
StartTime := A_TickCount
}
Return

T Up::
{
UpTime := A_TickCount
ElapsedTime := UpTime - StartTime
MsgBox,  %ElapsedTime% milliseconds have elapsed.
}
Return</code></pre></div><p>Выводит рандомные значения. Иногда 40 мс, иногда 60, иногда 150, иногда 450. Хотя кнопку я зажимаю на 1 секунду или 5 секунд...</p>]]></content>
			<author>
				<name><![CDATA[sergeant.coolagin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25809</uri>
			</author>
			<updated>2012-07-05T16:01:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61386#p61386</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61376#p61376" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>r::
    KeyWait, r
    MsgBox % A_TimeSinceThisHotkey
    return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2012-07-05T06:07:36Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61376#p61376</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61375#p61375" />
			<content type="html"><![CDATA[<p>Если не использовать таймер, то вот простой вариант </p><div class="codebox"><pre><code>StartTime := A_TickCount
Sleep, 1000
ElapsedTime := A_TickCount - StartTime
MsgBox,  %ElapsedTime% milliseconds have elapsed.</code></pre></div><p>думаю всё понятно, <strong>A_TickCount</strong> встроенная переменная.<br />Конечно можно и по другому - вариантов много.</p>]]></content>
			<author>
				<name><![CDATA[Indomito]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27285</uri>
			</author>
			<updated>2012-07-05T00:51:21Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61375#p61375</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61374#p61374" />
			<content type="html"><![CDATA[<p>Допустим, мне нужно сделать какое-то действие по нажатию на клавишу R. Если я просто тыкаю кнопку, то выполняется какое-то одно действие, если зажимаю на опр. период времени - другое.<br />Я себе это представляю так:<br /></p><div class="codebox"><pre><code>
R::
{
*Запустить секундомер и записывать время на секундомере в опр. переменную*
}

R Up::
{
if кнопка была нажата &lt; 50мс до отпускания
{
;Выполнить этот участок кода
}

else if кнопка была нажата &gt; 50мс до отпускания
{
;Выполнить этот участок кода
}
Return</code></pre></div><p>Подскажите, пожалуйста, как отследить сколько времени была нажата кнопка после нажатия и до отпускания?</p>]]></content>
			<author>
				<name><![CDATA[sergeant.coolagin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25809</uri>
			</author>
			<updated>2012-07-05T00:24:17Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61374#p61374</id>
		</entry>
</feed>
