<?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=7324</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7324&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Как отследить сколько времени нажата клавиша?».]]></description>
		<lastBuildDate>Mon, 09 Jul 2012 23:08:29 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61475#p61475</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Mon, 09 Jul 2012 23:08:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61475#p61475</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61445#p61445</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Grey)]]></author>
			<pubDate>Mon, 09 Jul 2012 05:45:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61445#p61445</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61442#p61442</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Mon, 09 Jul 2012 00:44:42 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61442#p61442</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61391#p61391</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Irbis)]]></author>
			<pubDate>Thu, 05 Jul 2012 19:08:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61391#p61391</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61390#p61390</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Почему не работает вот так?</p></blockquote></div><p>Работает так, это вам кажется, что «не работает».</p><p>Нажали вы клавишу, перехватилось autohotkey-ем это событие, выполнилась подпрограмма от T:: до return, продолжаете удерживать клавишу — продолжают «клавиатурой» отправляться нажатия, продолжает выполняться подпрограмма от T:: до return, отпускаете клавишу выполняется подпрограмма от T Up:: до return, видите время прошедшее с момента перехвата отправленного нажатия до момента перехвата отправленного «отпускания».</p><p>Возможно, стоит таки обратить внимание на пример из сообщения #3.</p>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Thu, 05 Jul 2012 17:38:39 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61390#p61390</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61388#p61388</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Thu, 05 Jul 2012 17:04:53 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61388#p61388</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61387#p61387</link>
			<description><![CDATA[<p>Зачем вы используете фигурные скобки для выделения части подпрограммы горячей клавиши?<br />Фигурные скобки там не требуются.<br />Значения не «рандомные», а соответствующие описанному алгоритму.<br />Если вы желаете видеть «длительность физического нажатия клавиши» используйте<strong> KeyWait</strong> и <strong>A_TimeSinceThisHotkey</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Thu, 05 Jul 2012 16:40:24 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61387#p61387</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61386#p61386</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Thu, 05 Jul 2012 16:01:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61386#p61386</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61376#p61376</link>
			<description><![CDATA[<div class="codebox"><pre><code>r::
    KeyWait, r
    MsgBox % A_TimeSinceThisHotkey
    return</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (creature.ws)]]></author>
			<pubDate>Thu, 05 Jul 2012 06:07:36 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61376#p61376</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61375#p61375</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Indomito)]]></author>
			<pubDate>Thu, 05 Jul 2012 00:51:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61375#p61375</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Как отследить сколько времени нажата клавиша?]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=61374#p61374</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Thu, 05 Jul 2012 00:24:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=61374#p61374</guid>
		</item>
	</channel>
</rss>
