<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Случайное срабатывание capslock при переключении языков]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10099</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10099&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Случайное срабатывание capslock при переключении языков».]]></description>
		<lastBuildDate>Wed, 12 Nov 2014 14:36:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Случайное срабатывание capslock при переключении языков]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=88231#p88231</link>
			<description><![CDATA[<div class="codebox"><pre><code>
#If GetKeyState(&quot;CapsLock&quot;, &quot;P&quot;)
    vk48:: ; h keycode
    myFunc()
    return
#If</code></pre></div><p>Также я надеюсь переключение языка у вас срабатывает по <strong>отпусканию</strong> Caps`a, с использованием KeyWait.<br />Также можно отключить Caps в системе.<br />И еще:<br /></p><div class="codebox"><pre><code>#If CapsRShift:=(GetKeyState(&quot;CapsLock&quot;, &quot;P&quot;) And GetKeyState(&quot;RShift&quot;, &quot;P&quot;))
    vk48:: ; h keycode
    myFunc()
    return
#If</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Wed, 12 Nov 2014 14:36:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=88231#p88231</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Случайное срабатывание capslock при переключении языков]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87976#p87976</link>
			<description><![CDATA[<p>Тут вставляется случайно скорее всего «родное» срабатываение капслука. Не знаю, как быть. Я, конечно, уже сделал, то что хочу, для вима, а именно, включение/выключение режима своих клавиш по двойному нажатию правого шифта. То есть, если я хочу использовать альт+l для движения курсора влево (кстати, как сделать так, чтобы с зажатым альт+шифт+l еще и текст выделялся?), я включаю режим вима (два раза шифт) и использую. Если нужна стандартная работа клавиш альт+l (в тотале к примеру переназначены) то снова два раза шифт, и он выключается. Но очень бы хотелось иметь капслук как клавишу. Тут же куча вариаций, капслук + клавиши ни одна программа не использует.</p>]]></description>
			<author><![CDATA[null@example.com (soulwhite)]]></author>
			<pubDate>Mon, 03 Nov 2014 22:45:29 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87976#p87976</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Случайное срабатывание capslock при переключении языков]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87975#p87975</link>
			<description><![CDATA[<div class="quotebox"><cite>Irbis пишет:</cite><blockquote><p>Попробуй сохранять состояние капслок перед переключением языка:<br /></p><div class="codebox"><pre><code>; ... 
$CapsLock::
   State := GetKeyState(&quot;Capslock&quot;, &quot;T&quot;) ? &quot;On&quot; : &quot;Off&quot;
   LangSwitch(2)
   SetCapsLockState, %State%
Return
; ...</code></pre></div><p>Возможно, как-то конфликтуют другие функции, слишком много всего завязано на одну клавишу. Надо бы по-хорошему весь этот сборный &quot;компот&quot; пересобрать, например переключение по Alt+CapsLock проще в одну строку сделать:<br /></p><div class="codebox"><pre><code>!CapsLock:: SetCapsLockState, % GetKeyState(&quot;Capslock&quot;, &quot;T&quot;) ? &quot;Off&quot; : &quot;On&quot;</code></pre></div></blockquote></div><p>Сделал все как вы сказали. Не сработало. Видимо, нельзя использовать капслук для переключения, и для горячих клавиш.&nbsp; А очень жаль, ибо на него можно повесить много всего. Еще конечно остается правый контрол и контекстное меню, но мне удобней для левой руки бы. По поводу кода, с английским не очень, только изучаю автохоткей, ваши приемы сокращения придут с опытом.</p>]]></description>
			<author><![CDATA[null@example.com (soulwhite)]]></author>
			<pubDate>Mon, 03 Nov 2014 22:35:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87975#p87975</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Случайное срабатывание capslock при переключении языков]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87955#p87955</link>
			<description><![CDATA[<p>Попробуй сохранять состояние капслок перед переключением языка:<br /></p><div class="codebox"><pre><code>; ... 
$CapsLock::
   State := GetKeyState(&quot;Capslock&quot;, &quot;T&quot;) ? &quot;On&quot; : &quot;Off&quot;
   LangSwitch(2)
   SetCapsLockState, %State%
Return
; ...</code></pre></div><p>Возможно, как-то конфликтуют другие функции, слишком много всего завязано на одну клавишу. Надо бы по-хорошему весь этот сборный &quot;компот&quot; пересобрать, например переключение по Alt+CapsLock проще в одну строку сделать:<br /></p><div class="codebox"><pre><code>!CapsLock:: SetCapsLockState, % GetKeyState(&quot;Capslock&quot;, &quot;T&quot;) ? &quot;Off&quot; : &quot;On&quot;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Irbis)]]></author>
			<pubDate>Mon, 03 Nov 2014 16:15:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87955#p87955</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Случайное срабатывание capslock при переключении языков]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=87934#p87934</link>
			<description><![CDATA[<p>Добрый день. Задача стоит такая: переключение языка по капслук, включение/выключение режима капслук по Альт+капслук, реверс неверной раскладки (ghbdtn ? привет) по контрол+капслук. И следующее, капс + любые клавиши = мои функции, к примеру, капс + hjkl — Vim-подобная навигация. НО! Если добавить в скрипт (все написано в одном файле) эти функции, т.е. капс+ клавиши, то капс начинает глючить при переключении языков, т.е. он включает нижний/верхний регистр символов. Проблема не в функции переключения. Для примера, нажимаем очень быстро любые кнопки на клавиатуре и нажимаем на капс, результат:<br /><strong>uiouщшuoiгoiuщшuoiгщшгщuщшгщшuшщгiouшщuioгшщuioгoiuшщuioг</strong><br />Как видим, все в порядке. Далее, добавляем в скрипт строку:<br /></p><div class="codebox"><pre><code>
; раскладка вима для навигации
CapsLock &amp; h:: send {Left}
</code></pre></div><p>И делаем то же самое, результат:<br /><strong>uoiUIOuIOUoiuoiГЩШгЩШГшщгщшuiГШЩГшouOuoiuOIUiouOIUIOгШЩГшщгшUIOuiou</strong><br />Почему так? Это пример был тестовый, на деле же, капс лук в стандартном режиме срабатывает иногда.<br />Приведу свой код, функции взяты с форумов:<br /></p><div class="codebox"><pre><code>
; Контекстное меню + wasd - навигация
AppsKey &amp; w:: send {PgUp}
Return
AppsKey &amp; s:: send {PgDn}
Return
AppsKey &amp; a:: send {Home}
Return
AppsKey &amp; d:: send {End}
Return
;-------------------------------------------------------------


; Контекстное меню + таб - неразрывный абзац.
AppsKey &amp; tab:: send {ASC 255}{ASC 255}{ASC 255}{ASC 255}
;-------------------------------------------------------------


; вставка кавычек
~!,:: send «»{Left}
Return
~!.:: send «»{Left}
Return
~!&#039;:: send &quot;&quot;{Left}
Return
;-------------------------------------------------------------


; вствка длинного тире (альт + минус)
~!-:: —
Return
;-------------------------------------------------------------




; ДВОЙНОЕ нажатие windows — запуск диспетчера задач
~LWin::
  if (A_PriorHotkey &lt;&gt; &quot;~LWin&quot; or A_TimeSincePriorHotkey &gt; 230)
; если предыдущая клавиша - не LWin,
; или со времени нажатия win прошло больше 230 миллисекунд, то...
{
  KeyWait, LWin
  ;ожидать, пока клавиша не будет отпущена
  ;(чтобы исключить срабатывание от простого удержания нажатой клавиши)
  Return ; закончить обработку горячей клавиши после отжатия клавиши
}
KeyWait, LWin
Run taskmgr.exe 
Return


;-------------------------------------------------------------
; обычная работа клавиши контекстного меню
~AppsKey::send, {AppsKey}
Return
;-------------------------------------------------------------




!CapsLock:: 
{ 
  
  GetKeyState, state, CapsLock, T ;  D if CapsLock is ON or U otherwise.
  state := GetKeyState(&quot;Capslock&quot;, &quot;T&quot;)  ; True if CapsLock is ON, false otherwise.

  if(state)
  {
    SetCapsLockState, off
    Return
  }
  if(not state)
  {
    SetCapsLockState, on
    Return
  }
}






$CapsLock::LangSwitch(2)
;$CapsLock up::LangSwitch(2)

LangSwitch( iKeyDownUp=0 )
{
    static tickLast
    IfEqual,iKeyDownUp,1
    {    tickLast=%A_TickCount%
        return
    }
    IfEqual,iKeyDownUp,2
        If( A_TickCount-tickLast&gt;900 )
            return

    HKL:=DllCall(&quot;GetKeyboardLayout&quot;, &quot;uint&quot;,GetThreadOfWindow(), &quot;uint&quot;)

    HKLnum:=DllCall(&quot;GetKeyboardLayoutList&quot;,&quot;uint&quot;,0,&quot;uint&quot;,0)
    VarSetCapacity( HKLlist, HKLnum*4, 0 )
    DllCall(&quot;GetKeyboardLayoutList&quot;,&quot;uint&quot;,HKLnum,&quot;uint&quot;,&amp;HKLlist)
    loop,%HKLnum%
    {    if( NumGet( HKLlist, (A_Index-1)*4 ) = HKL )
        {    HKL:=NumGet( HKLlist, mod(A_Index,HKLnum)*4 )
            break
        }
    }
    ControlGetFocus,ctl,A
    SendMessage,0x50,0,HKL,%ctl%,A ;WM_INPUTLANGCHANGEREQUEST

    ;show traytip
    LOCALE_SENGLANGUAGE=0x1001
    LOCALE_SENGCOUNTRY=0x1002
    VarSetCapacity( sKbd, 260, 0 )
    VarSetCapacity( sCountry, 260, 0 )
    DllCall(&quot;GetLocaleInfo&quot;,&quot;uint&quot;,HKL&gt;&gt;16,&quot;uint&quot;,LOCALE_SENGLANGUAGE, &quot;str&quot;,sKbd, &quot;uint&quot;,260)
    DllCall(&quot;GetLocaleInfo&quot;,&quot;uint&quot;,HKL &amp; 0xFFFF,&quot;uint&quot;,LOCALE_SENGCOUNTRY, &quot;str&quot;,sCountry, &quot;uint&quot;,260)
    traytip,%sKbd%,%sCountry%
    SetTimer,REMOVE_TOOLTIP,5000 ;0.5 second
    return
REMOVE_TOOLTIP:
    SetTimer,REMOVE_TOOLTIP,off
    traytip
    return
}

;returns first thread for the &lt;processID&gt;
;sets optional &lt;List&gt; to pipe | separated thread list for the &lt;processID&gt;
GetProcessThreadOrList( processID, byRef list=&quot;&quot; )
{
    ;THREADENTRY32 {
    THREADENTRY32_dwSize=0 ; DWORD
    THREADENTRY32_cntUsage = 4    ;DWORD
    THREADENTRY32_th32ThreadID = 8    ;DWORD
    THREADENTRY32_th32OwnerProcessID = 12    ;DWORD
    THREADENTRY32_tpBasePri = 16    ;LONG
    THREADENTRY32_tpDeltaPri = 20    ;LONG
    THREADENTRY32_dwFlags = 24    ;DWORD
    THREADENTRY32_SIZEOF = 28

    TH32CS_SNAPTHREAD=4

    hProcessSnap := DllCall(&quot;CreateToolhelp32Snapshot&quot;,&quot;uint&quot;,TH32CS_SNAPTHREAD, &quot;uint&quot;,0)
    ifEqual,hProcessSnap,-1, return

    VarSetCapacity( thE, THREADENTRY32_SIZEOF, 0 )
    NumPut( THREADENTRY32_SIZEOF, thE )

    ret=-1

    if( DllCall(&quot;Thread32First&quot;,&quot;uint&quot;,hProcessSnap, &quot;uint&quot;,&amp;thE ))
        loop
        {
            if( NumGet( thE ) &gt;= THREADENTRY32_th32OwnerProcessID + 4)
                if( NumGet( thE, THREADENTRY32_th32OwnerProcessID ) = processID )
                {    th := NumGet( thE, THREADENTRY32_th32ThreadID )
                    IfEqual,ret,-1
                        ret:=th
                    list .=  th &quot;|&quot;
                }
            NumPut( THREADENTRY32_SIZEOF, thE )
            if( DllCall(&quot;Thread32Next&quot;,&quot;uint&quot;,hProcessSnap, &quot;uint&quot;,&amp;thE )=0)
                break
        }

    DllCall(&quot;CloseHandle&quot;,&quot;uint&quot;,hProcessSnap)
    StringTrimRight,list,list,1
    return ret
}

; Returns thread owning specified window handle
; default = Active window
GetThreadOfWindow( hWnd=0 )
{
    IfEqual,hWnd,0
        hWnd:=WinExist(&quot;A&quot;)
    DllCall(&quot;GetWindowThreadProcessId&quot;, &quot;uint&quot;,hWnd, &quot;uintp&quot;,id)
    GetProcessThreadOrList(  id, threads )
    IfEqual,threads,
        return 0
    CB:=RegisterCallback(&quot;GetThreadOfWindowCallBack&quot;,&quot;Fast&quot;)
    lRet=0
    lParam:=hWnd
    loop,parse,threads,|
    {    NumPut( hWnd, lParam )
        DllCall(&quot;EnumThreadWindows&quot;, &quot;uint&quot;,A_LoopField, &quot;uint&quot;,CB, &quot;uint&quot;,&amp;lParam)
        if( NumGet( lParam )=true )
        {    lRet:=A_LoopField
            break
        }
    }
    DllCall(&quot;GlobalFree&quot;, &quot;uint&quot;, CB)
    return lRet
}

GetThreadOfWindowCallBack( hWnd, lParam )
{
    IfNotEqual,hWnd,% NumGet( 0+lParam )
        return true
    NumPut( true, 0+lParam )
    return 0
}






LControl &amp; $CapsLock::RecodeTextENRU()

RecodeTextENRU()
{
    StringCaseSense On
    AutoTrim,Off

    clipSave:=clipAnsi()
    send ^{Insert}
    sleep,50

    dest=
    text:=clipAnsi()
    StringCaseSense,On
    prevCharToEN=0
    ;        АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
    RUtoEN=F&lt;DULT:PBQRKVYJGHCNEA{WXIO}SM&quot;&gt;Zf,dult;pbqrkvyjghcnea[wxio]sm&#039;.z
    RUtoSP1=хъжэбюХЪЖЭБЮ.,/&quot;№;:?
    RUtoSP2=[];&#039;,.{}:&quot;&lt;&gt;/?|@#$^&amp;
    ;&quot;         ABCDEFGHIJKLMNOPQRSTUVWXYZ
    ENtoRU=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчня

    loop,parse,text
    {
        destChar=%A_LoopField%

        ; check explicit (non punctuations) ranges
        ifGreaterOrEqual,A_LoopField,А
            prevCharToEN=1
        else if A_LoopField between A and Z
            prevCharToEN=0
        else if A_LoopField between a and z
            prevCharToEN=0

        ; to Russian
        ifEqual,prevCharToEN,0
        {    StringGetPos,i,RUtoEN,%A_LoopField%
            ifEqual,ErrorLevel,0
                Transform,destChar,chr,% i + 0xC0
            else
            {    StringGetPos,i,RUtoSP2,%A_LoopField%
                ifEqual,ErrorLevel,0
                    StringMid,destChar,RUtoSP1,% i+1, 1
            }
        }

        ; to English because nothing changed
        ifEqual,destChar,%A_LoopField%
        {
            StringGetPos,i,ENtoRU,%A_LoopField%
            ifEqual,ErrorLevel,0
                Transform,destChar,chr,% i + (i&gt;=26 ? 71 : 65)
            else ; check .,;&#039;:&quot;[]{}
            {    StringGetPos,i,RUtoSP1,%A_LoopField%
                ifEqual,ErrorLevel,0,StringMid,destChar,RUtoSP2,% i+1, 1
            }
            ifNotEqual,destChar,%A_LoopField%
                prevCharToEN=1
        }
        dest=%dest%%destChar%
    }

    ; decide compatibility of unicode clipboard
    WinGetClass,cls,A
    if cls in TMsgEditor,wndclass_desked_gsk
    {
        ControlGetFocus,cls,A
        ifInString,cls,TXTRichEdit
            clipSetUnicode(dest)
        else
            Clipboard=%dest%
    }
    else
        clipSetUnicode(dest)
    sleep,50
    send +{Insert}
    sleep 50

    clipSetUnicode(clipSave)
    LangSwitch()
}

; read unicode clipboard into ansi string
clipAnsi()
{
    StringLen,L,Clipboard
    L:=(L+1)*4
    transform,ca_Clip,unicode
    varSetCapacity(ca_WideText,L,0)
    varSetCapacity(ca_AnsiText,L,0)
    ; Convert UTF-8 to UTF-16.    CP_UTF8=65001
    if dllCall(&quot;MultiByteToWideChar&quot;,uint,65001, uint,0, str,ca_Clip
                  , uint,-1, str,ca_WideText, uint,L/2)
        dllCall(&quot;WideCharToMultiByte&quot;,uint,0, uint,0, str,ca_WideText
                  , uint,-1, str,ca_AnsiText, uint,L/2, uint,0, uint,0)
        ; Convert UTF-16 to ANSI.  CP_ACP=0
    return ca_AnsiText
}

;--------------------------------------------------------------
; copy ansi string to clipboard in unicode mode
clipSetUnicode(cu_AnsiText)
{
    StringLen,L,cu_AnsiText
    L:=(L+1)*4
    varSetCapacity(cu_WideText,L,0)
    varSetCapacity(cu_UTFtext,L,0)
    ; ANSI to UTF-16.    CP_ACP=0
    if dllCall(&quot;MultiByteToWideChar&quot;,uint,0, uint,0, str,cu_AnsiText
                  , uint,-1, str,cu_WideText, uint,L/2)
        dllCall(&quot;WideCharToMultiByte&quot;,uint,65001, uint,0, str,cu_WideText
                  , uint,-1, str,cu_UTFtext, uint,L/2, uint,0, uint,0)
        ; Convert UTF-16 to UTF-8.  CP_UTF8=65001
    transform,clipboard,unicode,%cu_UTFtext%
}











; раскладка вима для навигации
CapsLock &amp; h:: send {Left}




</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (soulwhite)]]></author>
			<pubDate>Sun, 02 Nov 2014 22:17:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=87934#p87934</guid>
		</item>
	</channel>
</rss>
