<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Переназначение LED-индикаторов клавиатуры]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6965</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6965&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Переназначение LED-индикаторов клавиатуры».]]></description>
		<lastBuildDate>Mon, 19 Mar 2012 18:09:43 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AHK: Переназначение LED-индикаторов клавиатуры]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=58087#p58087</link>
			<description><![CDATA[<p>Господа, заранее прошу прощения за детский вопрос, но я не разработчик и осилить язык глубже азов быстро не могу. Собственно проблема возникла при совмещении нескольких шатко-валко работающих по отдельности скриптов в один. Но лучше по порядку.</p><p>В обоих скриптах используется <a href="http://www.autohotkey.com/forum/topic10532.html">Keyboard LED control</a> авторства Shimanov&#039;а, Peter&#039;а, JGR и evl&#039;а, а точнее — дописанный Lexikos&#039;ом Keyboard LED control for AutoHotkey_L. Он там в конце темы, но давайте я скопирую сюда код, чтоб вы ничего не искали.</p><div class="codebox"><pre><code>
/*

    Keyboard LED control for AutoHotkey_L
        http://www.autohotkey.com/forum/viewtopic.php?p=468000#468000

    KeyboardLED(LEDvalue, &quot;Cmd&quot;, Kbd)
        LEDvalue  - ScrollLock=1, NumLock=2, CapsLock=4
        Cmd       - on/off/switch
        Kbd       - index of keyboard (probably 0 or 2)

*/

KeyboardLED(LEDvalue, Cmd, Kbd=0)
{
  SetUnicodeStr(fn,&quot;\Device\KeyBoardClass&quot; Kbd)
  h_device:=NtCreateFile(fn,0+0x00000100+0x00000080+0x00100000,1,1,0x00000040+0x00000020,0)
  
  If Cmd= switch  ;switches every LED according to LEDvalue
   KeyLED:= LEDvalue
  If Cmd= on  ;forces all choosen LED&#039;s to ON (LEDvalue= 0 -&gt;LED&#039;s according to keystate)
   KeyLED:= LEDvalue | (GetKeyState(&quot;ScrollLock&quot;, &quot;T&quot;) + 2*GetKeyState(&quot;NumLock&quot;, &quot;T&quot;) + 4*GetKeyState(&quot;CapsLock&quot;, &quot;T&quot;))
  If Cmd= off  ;forces all choosen LED&#039;s to OFF (LEDvalue= 0 -&gt;LED&#039;s according to keystate)
    {
    LEDvalue:= LEDvalue ^ 7
    KeyLED:= LEDvalue &amp; (GetKeyState(&quot;ScrollLock&quot;, &quot;T&quot;) + 2*GetKeyState(&quot;NumLock&quot;, &quot;T&quot;) + 4*GetKeyState(&quot;CapsLock&quot;, &quot;T&quot;))
    }
  
  success := DllCall( &quot;DeviceIoControl&quot;
              ,  &quot;ptr&quot;, h_device
              , &quot;uint&quot;, CTL_CODE( 0x0000000b     ; FILE_DEVICE_KEYBOARD
                        , 2
                        , 0             ; METHOD_BUFFERED
                        , 0  )          ; FILE_ANY_ACCESS
              , &quot;int*&quot;, KeyLED &lt;&lt; 16
              , &quot;uint&quot;, 4
              ,  &quot;ptr&quot;, 0
              , &quot;uint&quot;, 0
              ,  &quot;ptr*&quot;, output_actual
              ,  &quot;ptr&quot;, 0 )
  
  NtCloseFile(h_device)
  return success
}

CTL_CODE( p_device_type, p_function, p_method, p_access )
{
  Return, ( p_device_type &lt;&lt; 16 ) | ( p_access &lt;&lt; 14 ) | ( p_function &lt;&lt; 2 ) | p_method
}


NtCreateFile(ByRef wfilename,desiredaccess,sharemode,createdist,flags,fattribs)
{
  VarSetCapacity(objattrib,6*A_PtrSize,0)
  VarSetCapacity(io,2*A_PtrSize,0)
  VarSetCapacity(pus,2*A_PtrSize)
  DllCall(&quot;ntdll\RtlInitUnicodeString&quot;,&quot;ptr&quot;,&amp;pus,&quot;ptr&quot;,&amp;wfilename)
  NumPut(6*A_PtrSize,objattrib,0)
  NumPut(&amp;pus,objattrib,2*A_PtrSize)
  status:=DllCall(&quot;ntdll\ZwCreateFile&quot;,&quot;ptr*&quot;,fh,&quot;UInt&quot;,desiredaccess,&quot;ptr&quot;,&amp;objattrib
                  ,&quot;ptr&quot;,&amp;io,&quot;ptr&quot;,0,&quot;UInt&quot;,fattribs,&quot;UInt&quot;,sharemode,&quot;UInt&quot;,createdist
                  ,&quot;UInt&quot;,flags,&quot;ptr&quot;,0,&quot;UInt&quot;,0, &quot;UInt&quot;)
  return % fh
}

NtCloseFile(handle)
{
  return DllCall(&quot;ntdll\ZwClose&quot;,&quot;ptr&quot;,handle)
}


SetUnicodeStr(ByRef out, str_)
{
  VarSetCapacity(out,2*StrPut(str_,&quot;utf-16&quot;))
  StrPut(str_,&amp;out,&quot;utf-16&quot;)
}</code></pre></div><p>Итак, первый используемый мной скрипт составлен evl&#039;ом и доступен во всё той же теме, во втором её сообщении. Скрипт инвертирует состояние индикатора Num Lock. Т. е. когда дополнительная цифровая клавиатура включена, индикатор не горит. В скрипт помимо приведённого выше блока входит следующий код:<br /></p><div class="codebox"><pre><code>
Gosub, ~NumLock
Return

~NumLock:: 
~CapsLock:: 
~ScrollLock::
  Sleep, 10 ; improve reliability of setting LED state sometimes
  If (GetKeyState(&quot;Numlock&quot;, &quot;T&quot;))
    KeyboardLED(2,&quot;off&quot;)
  Else
    KeyboardLED(2,&quot;on&quot;)
Return</code></pre></div><p>Второй, используемый мной скрипт должен зажигать индикатор Scroll Lock, когда включена английская раскладка клавиатуры. Он составлен по мотивам <a href="http://forum.script-coding.com/viewtopic.php?id=305">реализации Ludens&#039;а</a>. Однако, у Ludens&#039;а индикатор зажигался, поскольку модифицировалось само состояние переключателя Scroll Lock. Я же хочу обойти переключатель и затронуть только индикатор, если есть такая возможность. Итак, в предлагаемом мной варианте помимо приведённого в начале блока используется следующий код:<br /></p><div class="codebox"><pre><code>
#Persistent

SetTimer RussianLED

RussianLED:
  WinGet, WID, ID, A
  WT := DllCall(&quot;GetWindowThreadProcessId&quot;, &quot;UInt&quot;, WID, &quot;UInt&quot;, 0)
  LID := DllCall(&quot;GetKeyboardLayout&quot;, &quot;UInt&quot;, WT)
  Russian := LID = 68748313 ? 1 : 0
  If Russian
    KeyboardLED(7,&quot;off&quot;)
  Else
    KeyboardLED(7,&quot;on&quot;)
Return</code></pre></div><p>Как я уже сказал, по отдельности эти скрипты работоспособны. Вопрос в том, чтобы добиться их одновременной слаженной работы, по возможности записав всё одним скриптом. И вершин удовольствия я достигну, если в этот единый скрипт можно будет безболезненно добавить ещё несколько переназначений, автозамен и прочих мелочей.</p>]]></description>
			<author><![CDATA[null@example.com (Gluck)]]></author>
			<pubDate>Mon, 19 Mar 2012 18:09:43 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=58087#p58087</guid>
		</item>
	</channel>
</rss>
