<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10377&amp;type=atom" />
	<updated>2015-03-10T22:12:51Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10377</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=92455#p92455" />
			<content type="html"><![CDATA[<p>Отлично, заодно и работа с A_CaretX &amp; A_CaretY стала намного проще&nbsp; - многие &quot;костыли&quot; стали не нужны.<br />Вообще, изменений много, что не может не радовать. )) Рекомендую заглянуть в ChangeLog АНК 1.1.20.x, для более подробного ознакомления.</p>]]></content>
			<author>
				<name><![CDATA[Irbis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27384</uri>
			</author>
			<updated>2015-03-10T22:12:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=92455#p92455</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=92452#p92452" />
			<content type="html"><![CDATA[<p>Отрапортовал lexikos&#039;у о баге. Баг был исправлен в версии 1.1.19.0.3.</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2015-03-10T20:50:35Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=92452#p92452</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91591#p91591" />
			<content type="html"><![CDATA[<p><a href="http://forum.script-coding.com/viewtopic.php?pid=91576#p91576">http://forum.script-coding.com/viewtopi … 576#p91576</a></p>]]></content>
			<author>
				<name><![CDATA[serzh82saratov]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27879</uri>
			</author>
			<updated>2015-02-15T19:25:20Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91591#p91591</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91557#p91557" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>NumPut(GuiThreadInfoSize, GuiThreadInfo, 0)</code></pre></div><p>Кажется понял: записывает в начало содержимого переменной ее собственный размер, видимо для того чтобы dllcall знал сколько он сможет туда записать (конечный адрес переменной).</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2015-02-14T10:30:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91557#p91557</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91554#p91554" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2015-02-14T10:02:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91554#p91554</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91552#p91552" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-02-14T09:19:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91552#p91552</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91543#p91543" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2015-02-13T12:18:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91543#p91543</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91134#p91134" />
			<content type="html"><![CDATA[<p>Бывает, когда &quot;горячая клавиша&quot; состоит из сочетания нескольких клавиш, случаются залипания. В частности, когда одновременно нажимается несколько клавиш, часть которых входит в состав &quot;горячей клавиши&quot;. Как-то так. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2015-01-31T20:10:34Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91134#p91134</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91132#p91132" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-01-31T18:46:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91132#p91132</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91125#p91125" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2015-01-31T14:08:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91125#p91125</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91108#p91108" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Если во время работы команды была зажата клавиша-модификатор, вполне вероятно, что она залипнет.</p></blockquote></div><p>Что-то такое припоминаю, но без использования <em>ControlGetFocus</em>. В скрипте имеются горячие клавиши?</p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2015-01-31T08:45:18Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91108#p91108</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91103#p91103" />
			<content type="html"><![CDATA[<p>В момент &quot;взятия фокуса&quot; двойной клик не работает...</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2015-01-31T05:26:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91103#p91103</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91098#p91098" />
			<content type="html"><![CDATA[<p>Запустите и поработайте какое-то время. Используйте клавиши Ctrl, Alt и Shift.<br />Не залипают?<br /></p><div class="codebox"><pre><code>Loop {
Sleep 50
ControlGetFocus, focusElement, A
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-01-31T02:42:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91098#p91098</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91090#p91090" />
			<content type="html"><![CDATA[<p>А предоставьте наипростейший код, который бы демонстрировал баг (пускай и не всегда).</p>]]></content>
			<author>
				<name><![CDATA[Drugoy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27463</uri>
			</author>
			<updated>2015-01-30T21:32:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91090#p91090</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=91081#p91081" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[stealzy]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=31937</uri>
			</author>
			<updated>2015-01-30T18:29:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=91081#p91081</id>
		</entry>
</feed>
