<?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=6397</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=6397&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Выполнить определенные действия по нажатию и отпусканию клавиши».]]></description>
		<lastBuildDate>Sun, 06 Nov 2011 21:17:49 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Выполнить определенные действия по нажатию и отпусканию клавиши]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53300#p53300</link>
			<description><![CDATA[<div class="quotebox"><cite>sergeant.coolagin пишет:</cite><blockquote><p>Эм, и что же Вы мне посоветуете делать? Не прописывать же мне 1000 раз, чтобы кнопка нажималась и отпускалась для достижения нужного эффекта?</p></blockquote></div><p>Только эмулировать действия драйвера. Простейший пример:<br /></p><div class="codebox"><pre><code>SPI_GETKEYBOARDDELAY := 0x0016
SPI_GETKEYBOARDSPEED := 0x000A 

SystemParametersInfo(Action, Param, retParam, WinIni)
{
   return DllCall(&quot;SystemParametersInfo&quot;, &quot;int&quot;, Action, &quot;int&quot;, Param, &quot;uint&quot;, retParam, &quot;int&quot;, WinIni)
}

return

MyKeyWait()
{
   global
   VarSetCapacity(TempVar,4)
   SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &amp;TempVar, 0)
   KeyboardDelay := NumGet(TempVar)
   SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &amp;TempVar, 0)
   KeyboardSpeed := NumGet(TempVar)
   VarSetCapacity(TempVar,0)
   KeyboardDelay:=(KeyboardDelay+1)/4
   KeyboardSpeed:=1/(2.5+KeyboardSpeed*27.7/31)
   Keywait Esc, T%KeyboardDelay%
   Send {G Down}
   loop % (5-KeyboardDelay)/KeyboardSpeed ;%
   {
      Keywait Esc, T%KeyboardSpeed%
	  if(!ErrorLevel)
	     return
      Send {G Down}
   }
}

Esc::
{
   Send {R}
   Send {F}
   Send {Left}
   Send {G Down}
   MyKeyWait()
   Send {G Up}
}
Return</code></pre></div><p>Но помимо того, что даже microsoft нам не гарантирует корректности возвращаемых данных об автоповторе, тут ещё и не учитываются никакие накладные расходы и отбрасывается остаток от (5-KeyboardDelay)/KeyboardSpeed. Можно повесить таймер, но при его стандартных настройках и максимальной частоте автоповтора мы получим погрешность около 25%(у этого кода примерно такая же). Самым лучшим выходом будет цикл while с ручным опросом клавиатуры(GetKeyState).</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Sun, 06 Nov 2011 21:17:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53300#p53300</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Выполнить определенные действия по нажатию и отпусканию клавиши]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53298#p53298</link>
			<description><![CDATA[<div class="quotebox"><cite>Александр_ пишет:</cite><blockquote><p><strong>sergeant.coolagin</strong>, вы неверно представляете себе работу сообщений о нажатии/отпускании клавиш. На самом деле, когда вы нажимаете клавишу окно получает сообщение об этом. Затем спустя некоторое время(см. <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms724947%28v=vs.85%29.aspx">SystemParametersInfo(SPI_GETKEYBOARDDELAY)</a>) начинает работать автоповтор. Это означает, что каждые несколько миллисекунд(см. <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms724947%28v=vs.85%29.aspx">SystemParametersInfo(SPI_GETKEYBOARDSPEED)</a>) окно будет получать сообщение о нажатии клавиши. Приложение знает о том, что это автоповтор по 30-му биту в lParam в сообщениях клавиатуры, но блокнот это игнорирует.</p></blockquote></div><p>Эм, и что же Вы мне посоветуете делать? Не прописывать же мне 1000 раз, чтобы кнопка нажималась и отпускалась для достижения нужного эффекта?</p>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Sun, 06 Nov 2011 20:02:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53298#p53298</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Выполнить определенные действия по нажатию и отпусканию клавиши]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53271#p53271</link>
			<description><![CDATA[<p><strong>sergeant.coolagin</strong>, вы неверно представляете себе работу сообщений о нажатии/отпускании клавиш. На самом деле, когда вы нажимаете клавишу окно получает сообщение об этом. Затем спустя некоторое время(см. <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms724947%28v=vs.85%29.aspx">SystemParametersInfo(SPI_GETKEYBOARDDELAY)</a>) начинает работать автоповтор. Это означает, что каждые несколько миллисекунд(см. <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms724947%28v=vs.85%29.aspx">SystemParametersInfo(SPI_GETKEYBOARDSPEED)</a>) окно будет получать сообщение о нажатии клавиши. Приложение знает о том, что это автоповтор по 30-му биту в lParam в сообщениях клавиатуры, но блокнот это игнорирует.</p>]]></description>
			<author><![CDATA[null@example.com (Александр_)]]></author>
			<pubDate>Sat, 05 Nov 2011 13:23:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53271#p53271</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Выполнить определенные действия по нажатию и отпусканию клавиши]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53155#p53155</link>
			<description><![CDATA[<p><span style="color: green"><strong>sergeant.coolagin</strong>, ознакомься с первой темой на странице, исправь заголовок.</span></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 03 Nov 2011 11:30:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53155#p53155</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Выполнить определенные действия по нажатию и отпусканию клавиши]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=53154#p53154</link>
			<description><![CDATA[<p>В общем, вот скрипт. И до меня не доходит, что все-таки я делаю неправильно:<br /></p><div class="codebox"><pre><code>Joy4::
{
Send {R Down}
Sleep, 50
Send {R Up}
Sleep, 200
Send {F Down}
Sleep, 50
Send {F Up}
Sleep, 200
Send {Left Down}
Sleep, 50
Send {Down Down}
Sleep, 300
Send {Left Up}
Sleep, 50
Send {Down Up}
Sleep, 50
Send {G Down}
Keywait, Joy4, T5
Send {G Up}
}
Return</code></pre></div><p>Нужно, чтобы по нажатию хоткея жалась кнопка R, через 200 мс жалась кнопка F, еще через 200 мс зажимались кнопки Left и down и через 300 мс эти две кнопка отпускались и после этого кнопка G оставалась в нажатом состоянии до отпускания&nbsp; Joy4 или до истечения 5 секунд(T5). И вроде как все правильно я написал, но скрипт работает неправильно. Вместо того, чтобы зажимать кнопки(например, Left и Down зажать на 300 мс или зажать G до отпускания Joy4) они просто нажимаются один раз.<br />Вот что у меня нажимается в блокноте, когда я зажимаю Joy4 на 5 секунд:<br /></p><div class="codebox"><pre><code>RGF</code></pre></div><p>А должно быть что-то вроде:<br /></p><div class="codebox"><pre><code>RGGGGGGGGGGGGGGF</code></pre></div><p>Как я понимаю, почему-то команды &quot;Send {кнопка Down}&quot; работают неправильно. И вместо зажимания кнопки просто один раз тыкают её т.е. фактически посылают просто &quot;Send {кнопка}&quot;<br />Версия AHK: 1.1.05.01<br />Помогите решить проблему, пожалуйста.</p><p>Еще вот по-другому попробовал сделать:<br /></p><div class="codebox"><pre><code>SetTimer, Rr, 100


Rr:
{
    GetKeyState, JState, Joy4

    if JState = D
    {
        
        if RStart = 1
        {
            Send {R Down}
            Sleep, 100
            Send {F Down}
            Sleep, 100
            Send {T Down}{Y Down}
            Sleep, 3000
            RState = 1
            RStart = 0
        }
        Send {G Down}
    }

    else if JState = U
    {

        if RState = 1
        {
            Send {R Up}
            Send {F UP}
            Send {G Up}
            RState = 0
        }

    }
    
    else
    {
        Return
    }
    
}
Return

Joy4::
{
RStart = 1
}
Return</code></pre></div><p>Тут и последовательность нажатий клавиш другая... Но самое важное это задержки и зажатие клавиш. А они и в первом и во втором варианте не зажимаются, а только нажимаются один раз. Как сделать так, чтобы они зажимались, а не просто нажимались? Такое ощущение, что Down теперь ничего не значит.</p>]]></description>
			<author><![CDATA[null@example.com (sergeant.coolagin)]]></author>
			<pubDate>Thu, 03 Nov 2011 11:20:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=53154#p53154</guid>
		</item>
	</channel>
</rss>
