<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: DllCall() и GetKeyboardState]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=15377</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15377&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: DllCall() и GetKeyboardState».]]></description>
		<lastBuildDate>Sun, 24 May 2020 21:02:21 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139706#p139706</link>
			<description><![CDATA[<p>Хотя для пары значений подойдёт.<br />Работает намного шустрее чем:<br /></p><div class="codebox"><pre><code>
		Loop 256
		{
			If NumGet(&amp;KeyState, A_Index, &quot;UChar&quot;) &gt;&gt; 7
				break
		}
</code></pre></div><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"><div class="codebox"><pre><code>
VarSetCapacity(KeyState, 256, 0)

Loop
{ 
	DllCall(&quot;AttachThreadInput&quot;, Ptr, DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, WinExist(&quot;A&quot;), UInt, 0)
	, UInt, DllCall(&quot;GetCurrentThreadId&quot;), UInt, 1) 
	DllCall(&quot;GetKeyboardState&quot;, Ptr, &amp;KeyState)
	
	press := DllCall(&quot;msvcrt\memchr&quot;, &quot;ptr&quot;, &amp;KeyState, &quot;UChar&quot;, 0x80, &quot;UInt&quot;, 256, &quot;Cdecl UInt&quot;) 
		|| DllCall(&quot;msvcrt\memchr&quot;, &quot;ptr&quot;, &amp;KeyState, &quot;UChar&quot;, 0x81, &quot;UInt&quot;, 256, &quot;Cdecl UInt&quot;) ? 1 : 0 
		
	ToolTip % press
	Sleep 1
}
</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 24 May 2020 21:02:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139706#p139706</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139705#p139705</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Тебе это наверняка известно, просто я впервые наткнулся, когда надо найти первое совпадение нужного значения байта.<br />Но в этом случае это не поможет.<br /></p><div class="codebox"><pre><code>
VarSetCapacity(match, 256, 0) 
NumPut(0x80, match, 8, &quot;UChar&quot;)

f := DllCall(&quot;msvcrt\memchr&quot;, &quot;ptr&quot;, &amp;match, &quot;Int&quot;, 0x80, &quot;Int&quot;, 256, &quot;Cdecl UInt&quot;)
MsgBox % (f - &amp;match) &lt; 0 ? &quot;not match&quot; : &quot;match&quot;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 24 May 2020 20:39:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139705#p139705</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139701#p139701</link>
			<description><![CDATA[<p>По-моему нельзя. Можно было бы, если бы была возможность произвести логическое &quot;и&quot; между двумя такими байтовыми массивами:<br /></p><div class="codebox"><pre><code>VarSetCapacity(match, 256, 0x80)
VarSetCapacity(KeyState, 256, 0)</code></pre></div><p>но вроде в winapi это не поддерживается.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sun, 24 May 2020 18:18:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139701#p139701</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139696#p139696</link>
			<description><![CDATA[<p>Разобрался, младший бит переключается у не переключателей с каждым нажатием, и не имеет для них смысла. Состояние клавиши находится в старшем бите.<br />Тогда ещё раз вопрос, возможно без перебора узнать что в каком то из байтов в старшем бите есть единица?</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"><div class="codebox"><pre><code>
SetFormat, IntegerFast, h
VarSetCapacity(KeyState, 256, 0)

Loop
{
	Tip =
	ThreadID := DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, WinExist(&quot;A&quot;), UInt, 0)
	DllCall(&quot;AttachThreadInput&quot;, Ptr, ThreadID
						  , UInt, DllCall(&quot;GetCurrentThreadId&quot;)
						  , UInt, 1) 
	DllCall(&quot;GetKeyboardState&quot;, Ptr, &amp;KeyState)
	
	Loop 256
		Tip .= (v := NumGet(&amp;KeyState, A_Index, &quot;UChar&quot;)) &gt;&gt; 7 ? GetKeyName(&quot;vk&quot; A_Index) &quot; &quot; v &quot;   &quot; A_Index  &quot;`n&quot;  : &quot;&quot;
	ToolTip %  Tip  
	Sleep 11
}
</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 24 May 2020 15:14:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139696#p139696</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139694#p139694</link>
			<description><![CDATA[<p>Лично для меня описание неоднозначно. <br />Если &quot; &lt; 0 ? GetKeyName&quot; заменить на &quot; != 0 ? GetKeyName&quot;, то будут видны все ключи. <br />И не ясно почему для некоторых клавиш появляются некие значения, после нажатия отпускания они могут исчезнуть...</p><p>Убрал под спойлер, так как ТС вроде сам хочет разобраться.<br /></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"><div class="codebox"><pre><code>
SetFormat, IntegerFast, h
VarSetCapacity(KeyState, 256, 0)

Loop
{
	Tip =
	ThreadID := DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, WinExist(&quot;A&quot;), UInt, 0)
	DllCall(&quot;AttachThreadInput&quot;, Ptr, ThreadID
						  , UInt, DllCall(&quot;GetCurrentThreadId&quot;)
						  , UInt, 1) 
	DllCall(&quot;GetKeyboardState&quot;, Ptr, &amp;KeyState)
	
	Loop 256
		Tip .= (v := NumGet(&amp;KeyState, A_Index, &quot;Char&quot;)) &lt; 0 ? GetKeyName(&quot;vk&quot; A_Index) &quot; &quot; v &quot;  &quot; A_Index  &quot;`n&quot;  : &quot;&quot;
	ToolTip %  Tip  
	Sleep 11
}
</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sun, 24 May 2020 13:54:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139694#p139694</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139662#p139662</link>
			<description><![CDATA[<p>Спасибо большое всем, кто отписался в теме. Пойду учить мат.часть. <br />1) Я полагал что полученный массив в функции можно будет просмотреть c помощью For-loop, чтобы понять, что внутри такого массива ключ, а что значения. Вот то, что я ожидал увидеть внутри:<br />ключ значение<br />0x41		0<br />0x42 	1<br />0x43		0<br />0x44		1<br />0x45		0<br />0x46		1<br />0x47		0<br />2) Если я помещаю код внутрь цикла содержимое массива меняется самопроизвольно. Я ожидал, что изменения будут только при на нажатии мной клавиш во время выполнения цикла.<br />3) если я нажимаю левую кнопку мыши в окне скрипта, то статус &quot;Не все нули&quot; : &quot;Все нули&quot; меняется от каждого нажатия, но не от клавиатуры. Как будто тугл.<br /></p><div class="codebox"><pre><code>
#Persistent
#SingleInstance force
if not (A_IsAdmin or RegExMatch(full_command_line, &quot; /restart(?!\S)&quot;))
{
try
{
if A_IsCompiled
Run *RunAs &quot;%A_ScriptFullPath%&quot; /restart
else
Run *RunAs &quot;%A_AhkPath%&quot; /restart &quot;%A_ScriptFullPath%&quot;
}
ExitApp
}
#InstallKeybdHook
#InstallMouseHook
#UseHook

VarSetCapacity(lpKeyState, 512, 0)

loop 
{
Result := DllCall(&quot;GetKeyboardState&quot;, &quot;Ptr&quot;, &amp;lpKeyState)
ToolTip,
(
% lpKeyState ? &quot;Не все нули&quot; : &quot;Все нули&quot;
)
}
return
</code></pre></div><p>В любом случае спасибо за помощь.</p>]]></description>
			<author><![CDATA[null@example.com (dmitry-semin)]]></author>
			<pubDate>Fri, 22 May 2020 04:05:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139662#p139662</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139650#p139650</link>
			<description><![CDATA[<p>Нет, там периодически печатные клавиши меняют состояния.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Thu, 21 May 2020 13:17:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139650#p139650</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139648#p139648</link>
			<description><![CDATA[<p><strong>serzh82saratov</strong><br />Ну, не знаю, может предварительно все toggle-клавиши в ноль установить, не пробовал.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 21 May 2020 12:26:37 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139648#p139648</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139647#p139647</link>
			<description><![CDATA[<p><strong>dmitry-semin</strong></p><p><span class="postimg"><img src="https://i.imgur.com/KWOeBZB.png" alt="https://i.imgur.com/KWOeBZB.png" /></span></p><p>Если описание параметра начинается с P или с lp — это значит, что ожидается указатель, адрес какого-либо буфера в памяти. В AHK такой буфер можно создать с помощью VarSetCapacity. В DllCall это будет тип данных &quot;Ptr&quot;:<br /></p><div class="codebox"><pre><code>DllCall(&quot;GetKeyboardState&quot;, &quot;Ptr&quot;, &amp;buff)</code></pre></div><p>где buff — это предварительно созданный буфер.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 21 May 2020 12:23:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139647#p139647</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139644#p139644</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Спасибо. <br />Забыл что там находятся не только нажатые клавиши, узнать без перебора что какое то из значений меньше нуля не получится?</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Thu, 21 May 2020 08:56:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139644#p139644</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139641#p139641</link>
			<description><![CDATA[<p>А разве функция ждет Byte?<br />Она ждет ссылку на массив байтов.<br />Как его создавать написано в справке по dllcall.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Thu, 21 May 2020 02:09:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139641#p139641</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139639#p139639</link>
			<description><![CDATA[<p>Исправил саму функцию (не исправил, а попытался).<br /></p><div class="codebox"><pre><code>Result := DllCall(&quot;GetKeyboardState&quot; , &quot;UChar&quot;, lpKeyState, &quot;int&quot;)</code></pre></div><p>int потому, что<br /></p><div class="quotebox"><blockquote><p>An Int should also be used for each BOOL argument expected by a function (a BOOL value should be either 1 or 0).</p></blockquote></div><p>Char потому, что <br /></p><div class="quotebox"><blockquote><p>An unsigned character (UChar) can be used with functions that expect a BYTE.</p></blockquote></div><p>На самом деле пробовал этот вариант уже. Он не работает.<br />Я вижу, что мое понимание&nbsp; DllCall на нулевом уровне, но я хотел бы все-таки научится.</p>]]></description>
			<author><![CDATA[null@example.com (dmitry-semin)]]></author>
			<pubDate>Thu, 21 May 2020 01:23:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139639#p139639</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139638#p139638</link>
			<description><![CDATA[<p>Легко:<br /></p><div class="codebox"><pre><code>VarSetCapacity(empty, 256, 0)
VarSetCapacity(state, 256, 0) 

NumPut(-128, state, 0x10 , &quot;Char&quot;)

b := DllCall(&quot;msvcrt\memcmp&quot;, &quot;Ptr&quot;, &amp;empty, &quot;Ptr&quot;, &amp;state, &quot;Ptr&quot;, 256)
MsgBox % b ? &quot;Не все нули&quot; : &quot;Все нули&quot;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Thu, 21 May 2020 00:05:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139638#p139638</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139637#p139637</link>
			<description><![CDATA[<p><strong>teadrinker</strong><br />Забегу немного вперёд, а можно без перебора узнать что в переменной не только нули?<br /></p><div class="codebox"><pre><code>
VarSetCapacity(state, 256, 0) 

NumPut(-128, state, 0x10 , &quot;Char&quot;)  

Loop % VarSetCapacity(state)
	If NumGet(&amp;state, A_Index, &quot;Char&quot;) &lt; 0 &amp;&amp; (b := 1)
		break
		
MsgBox % b ? &quot;Не все нули&quot; : &quot;Все нули&quot;
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 20 May 2020 23:47:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139637#p139637</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: DllCall() и GetKeyboardState]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=139628#p139628</link>
			<description><![CDATA[<p>Почти всё верно, только почему вы решили, что значение result будет зависеть от статуса одной клавиши? Это просто показатель успешного или неуспешного выполнения всей функции.<br /></p><div class="quotebox"><blockquote><div class="codebox"><pre><code>Result := DllCall(&quot;GetKeyboardState&quot; , PBYTE, lpKeyState, &quot;BOOL&quot;)</code></pre></div></blockquote></div><p>Говорите, прочитали документацию по DllCall, тогда что такое у вас PBYTE и BOOL? Почему одно в кавычках, другое — нет? Читайте внимательно раздел Types of Arguments and Return Values.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 20 May 2020 11:03:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=139628#p139628</guid>
		</item>
	</channel>
</rss>
