<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10377</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10377&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом».]]></description>
		<lastBuildDate>Tue, 10 Mar 2015 22:12:51 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=92455#p92455</link>
			<description><![CDATA[<p>Отлично, заодно и работа с A_CaretX &amp; A_CaretY стала намного проще&nbsp; - многие &quot;костыли&quot; стали не нужны.<br />Вообще, изменений много, что не может не радовать. )) Рекомендую заглянуть в ChangeLog АНК 1.1.20.x, для более подробного ознакомления.</p>]]></description>
			<author><![CDATA[null@example.com (Irbis)]]></author>
			<pubDate>Tue, 10 Mar 2015 22:12:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=92455#p92455</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=92452#p92452</link>
			<description><![CDATA[<p>Отрапортовал lexikos&#039;у о баге. Баг был исправлен в версии 1.1.19.0.3.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Tue, 10 Mar 2015 20:50:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=92452#p92452</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91591#p91591</link>
			<description><![CDATA[<p><a href="http://forum.script-coding.com/viewtopic.php?pid=91576#p91576">http://forum.script-coding.com/viewtopi … 576#p91576</a></p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 15 Feb 2015 19:25:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91591#p91591</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91557#p91557</link>
			<description><![CDATA[<div class="codebox"><pre><code>NumPut(GuiThreadInfoSize, GuiThreadInfo, 0)</code></pre></div><p>Кажется понял: записывает в начало содержимого переменной ее собственный размер, видимо для того чтобы dllcall знал сколько он сможет туда записать (конечный адрес переменной).</p>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Sat, 14 Feb 2015 10:30:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91557#p91557</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91554#p91554</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Понял, переменной присвоен адрес, по которому будет возращено значение.<br />Почему именно по этому адресу? Почему не по адресу 12345?</p></blockquote></div><p>При создании любой переменной ей дается адрес в памяти процесса самого скрипта. (на сколько я знаю)<br /></p><div class="quotebox"><blockquote><p>Номер адреса возврата должен всегда совпадать с размером возращаемой структуры?</p></blockquote></div><p>Как я уже сказал выше, переменная получает адрес, затем VarSetCapacity расширяет место этой переменной (т.е. последующие адреса становятся частью переменной, например: адрес переменной 0x4000 -&gt; соответственно 0x4001...0x4100 (смотря сколько дала VarSetCapacity) будет являться частью переменной).</p><p>Может я ошибаюсь в терминах, сам еще не разобрался во всем.<br />Функции данные взял из свежей справки и дописал к ним, чтобы можно было указывать hwnd окна, изначально функция использовала текущий поток.</p><div class="quotebox"><blockquote><p>NumPut(GuiThreadInfoSize, GuiThreadInfo, 0)</p></blockquote></div><p>Меняет формат содержимого переменной насколько я знаю. (надо еще справку почитать...)</p>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Sat, 14 Feb 2015 10:02:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91554#p91554</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91552#p91552</link>
			<description><![CDATA[<p>Провел сравнительный тест на 1000 циклов — ваш вариант vs ControlGetFocus.<br />Поскольку ControlGetFocus работал&nbsp; на 16мс быстрее, добавил к нему соответствующий sleep.</p><p>Результат: ControlGetFocus - стабильные залипания; DllCall - залипаний не обнаружено.<br />Взял на вооружение, спасибо!<br />------------------------------------------------------------<br />Есть некоторые проблемы с понимаем DllCall.<br />Вот как я распарсил ваш код:<br /></p><div class="codebox"><pre><code>GuiThreadInfoSize := 24 + (A_PtrSize * 6)</code></pre></div><p>; устанавливаем размер в 24+4*6 (32-bit)<br />; судя по тому, что в <a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms632604(v=vs.85).aspx">GUITHREADINFO structure</a> 9 элементов<br />; из них 6 типа HWND, можно сделать вывод, что HWND зависит от битности системы, а DWORD и RECT занимают по 8 bit.<br /></p><div class="codebox"><pre><code>VarSetCapacity(GuiThreadInfo, GuiThreadInfoSize)</code></pre></div><p>; объявляем перем. GuiThreadInfo размером %GuiThreadInfoSize%<br /> </p><div class="codebox"><pre><code>NumPut(GuiThreadInfoSize, GuiThreadInfo, 0)</code></pre></div><p>; присваиваем GuiThreadInfo значение GuiThreadInfoSize.<br /><span style="color: #cccccc">Но ведь туда будет возвращено значение из функции, т.е. она должна быть пустой.</span> Понял, переменной присвоен адрес, по которому будет возращено значение.<br />Почему именно по этому адресу? Почему не по адресу 12345?<br />Номер адреса возврата должен всегда совпадать с размером возращаемой структуры?<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;дальше понятно</div><div class="fancy_spoiler"><div class="codebox"><pre><code>GuiThreadID:=DllCall(&quot;GetWindowThreadProcessId&quot;,ptr, HwndMain,int,0)
; получаем Id процесса
if DllCall(&quot;GetGUIThreadInfo&quot;, uint, GuiThreadID, ptr, &amp;GuiThreadInfo)
; передаем id, и указатель на структуру,
; куда будет возвращено значение
  {
    WinGet, ClassNNList, ControlList, ahk_id %HwndMain%
    Loop, PARSE, ClassNNList, `n
    {
      ControlGet, hwnd, hwnd,,%A_LoopField%,ahk_id %HwndMain%
      if (hWnd = NumGet(GuiThreadInfo, 8 + A_PtrSize))
; получаем id из структуры GuiThreadInfo со смещением 8 + A_PtrSize:
; понятно, там находится hwndFocus
}</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Sat, 14 Feb 2015 09:19:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91552#p91552</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91543#p91543</link>
			<description><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Выяснилось, что повинна в таком неподобающем поведении команда ControlGetFocus.</p></blockquote></div><p>Вот замена для ControlGetFocus:<br /></p><div class="codebox"><pre><code>
loop
{
  sleep,30
  mousegetpos,,,mwin,mctrl

  fctrl:=GetFocusedClassNN(mwin)

  tooltip,Под мышкой: &quot;%mctrl%&quot;`n    В фокусе: &quot;%fctrl%&quot;
}


GetFocusedClassNN(hwindow)
{
  GuiThreadInfoSize := 24 + (A_PtrSize * 6)
  VarSetCapacity(GuiThreadInfo, GuiThreadInfoSize)
  NumPut(GuiThreadInfoSize, GuiThreadInfo, 0)
  GuiThreadID:=DllCall(&quot;GetWindowThreadProcessId&quot;,ptr, hwindow,int,0)
  if DllCall(&quot;GetGUIThreadInfo&quot;, uint, GuiThreadID, ptr, &amp;GuiThreadInfo)
  {
    WinGet, ClassNNList, ControlList, ahk_id %hwindow%
    Loop, PARSE, ClassNNList, `n
    {
      ControlGet, hwnd, hwnd,,%A_LoopField%,ahk_id %hwindow%
      if (hWnd = NumGet(GuiThreadInfo, 8 + A_PtrSize))
        return A_LoopField
    }
  }
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Fri, 13 Feb 2015 12:18:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91543#p91543</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91134#p91134</link>
			<description><![CDATA[<p>Бывает, когда &quot;горячая клавиша&quot; состоит из сочетания нескольких клавиш, случаются залипания. В частности, когда одновременно нажимается несколько клавиш, часть которых входит в состав &quot;горячей клавиши&quot;. Как-то так. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Sat, 31 Jan 2015 20:10:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91134#p91134</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91132#p91132</link>
			<description><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p>Что-то такое припоминаю, но без использования <em>ControlGetFocus</em>. В скрипте имеются горячие клавиши?</p></blockquote></div><p>Имееются. У меня без использования ControlGetFocus все ок.<br />2 <strong>Drugoy</strong>: хорошо вам.<br /><span style="color: #555555">Про двойной клик это давно известная проблема, если увеличить интервал между командами, будет незаметно. А залипания (у меня) остаются.</span></p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Sat, 31 Jan 2015 18:46:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91132#p91132</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91125#p91125</link>
			<description><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Запустите и поработайте какое-то время. Используйте клавиши Ctrl, Alt и Shift.<br />Не залипают?</p></blockquote></div><p>Нет, не залипают.</p><div class="quotebox"><cite>Alectric пишет:</cite><blockquote><p>В момент &quot;взятия фокуса&quot; двойной клик не работает...</p></blockquote></div><p>Подтверждаю. Но не везде: не могу открыть что-либо с рабочего стола двойным кликом и в TotalCommander&#039;е перестал двойной клик работать, а в остальных местах вроде бы всё ок.</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Sat, 31 Jan 2015 14:08:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91125#p91125</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91108#p91108</link>
			<description><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Если во время работы команды была зажата клавиша-модификатор, вполне вероятно, что она залипнет.</p></blockquote></div><p>Что-то такое припоминаю, но без использования <em>ControlGetFocus</em>. В скрипте имеются горячие клавиши?</p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Sat, 31 Jan 2015 08:45:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91108#p91108</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91103#p91103</link>
			<description><![CDATA[<p>В момент &quot;взятия фокуса&quot; двойной клик не работает...</p>]]></description>
			<author><![CDATA[null@example.com (Alectric)]]></author>
			<pubDate>Sat, 31 Jan 2015 05:26:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91103#p91103</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91098#p91098</link>
			<description><![CDATA[<p>Запустите и поработайте какое-то время. Используйте клавиши Ctrl, Alt и Shift.<br />Не залипают?<br /></p><div class="codebox"><pre><code>Loop {
Sleep 50
ControlGetFocus, focusElement, A
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Sat, 31 Jan 2015 02:42:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91098#p91098</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91090#p91090</link>
			<description><![CDATA[<p>А предоставьте наипростейший код, который бы демонстрировал баг (пускай и не всегда).</p>]]></description>
			<author><![CDATA[null@example.com (Drugoy)]]></author>
			<pubDate>Fri, 30 Jan 2015 21:32:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91090#p91090</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=91081#p91081</link>
			<description><![CDATA[<p>Обратил внимание на зажатие(логическое), время от времени, некоторых клавиш - модификаторов при использовании нек. AHK - скриптов.<br />Приходилось клацать по &quot;зажатым&quot; клавишам, чтобы их &quot;отжать&quot;.</p><p>Выяснилось, что повинна в этом поведении команда ControlGetFocus. Сама она клавиши не нажимает, но, каким-то образом, не дает отпускать нажатые(физически). <span style="color: green">Точнее, если во время работы команды была зажата клавиша-модификатор, есть вероятность, что она залипнет.</span></p><p>Небольшая функция, правящая сей недостаток —<br />— приводит логическое состояние клавиш к физическому:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;source code</div><div class="fancy_spoiler"><div class="codebox"><pre><code>ControlGetFixBugUnpressKeys() {
    Static ArrayKeys
    ArrayKeys:=Object()
    ArrayKeys:=[&quot;RCtrl&quot;, &quot;LCtrl&quot;, &quot;LShift&quot;, &quot;RShift&quot;, &quot;RAlt&quot;, &quot;LAlt&quot;]
    i:= ArrayKeys.MaxIndex()
    Loop %i%
    {
        Key:=ArrayKeys[A_Index]
        GetKeyStatePhys := GetKeyState(Key, &quot;P&quot;)
        GetKeyStateLogi := GetKeyState(Key)
        DiffKeyState := GetKeyStateLogi-GetKeyStatePhys
        if DiffKeyState {
            Direction := (DiffKeyState=1) ? &quot;Up&quot; : &quot;Down&quot;
            SendInput {%Key% %Direction%}
            ; MsgBox %Key% will be not %Direction%. I fix it.
        }
    }
}</code></pre></div></div></div><p>-----------------------------------------------<br />UPD: в другой ветке <strong>Irbis</strong> радикально сократил объем кода:</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"><p>FixBugUnpressKeys() {<br />&nbsp; &nbsp;for key, key in [&quot;RCtrl&quot;, &quot;LCtrl&quot;, &quot;LShift&quot;, &quot;RShift&quot;, &quot;RAlt&quot;, &quot;LAlt&quot;]<br />&nbsp; &nbsp; &nbsp; if Direction := [0,0,&quot;Up&quot;][2+GetKeyState(Key)-GetKeyState(Key, &quot;P&quot;)]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SendInput {%Key% %Direction%}<br />}</p></div></div><p>-----------------------------------------------<br />UPD2: ниже <strong>Alectric</strong> предложил <a href="http://forum.script-coding.com/viewtopic.php?pid=91552#p91543">альтернативу ControlGetFocus</a> с помощью DllCall,<br />почти? не страдающую этим недостатком,<br />+ <span class="bbu">работает двойной клик</span> (известная проблема ControlGetFocus),<br /><span style="color: grey">- работает на 16мс дольше.</span></p><p><span style="color: #fafafa">controlgetfocus bug nipped pressed down keys</span></p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Fri, 30 Jan 2015 18:29:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=91081#p91081</guid>
		</item>
	</channel>
</rss>
