【问题标题】:Alt+Shift shortcut works unreliably in AHKAlt+Shift 快捷键在 AHK 中运行不可靠
【发布时间】:2016-06-01 17:38:12
【问题描述】:

我在 Windows 10 上运行 AHK 以便能够使用 CapsLock 进行语言切换(但这不是唯一的目的)。

这是脚本的相关部分:

SetCapsLockState, AlwaysOff
+CapsLock::CapsLock

*CapsLock::Send, {ALTDOWN}{SHIFTDOWN}{SHIFTUP}{ALTUP}

快捷方式的工作方式有点不可靠,就像它不会每三四次切换一次语言,或者类似的东西。

这可能是什么问题?

谢谢!

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    像这样尝试:

    SetCapsLockState, off  ;  may work with SetCapsLockState, AlwaysOff
    +CapsLock::  ;  Shift CapsLock toggles CapsLock state
        if GetKeyState("CapsLock", "T") = 1
            SetCapsLockState, off
        else if GetKeyState("CapsLock", "F") = 0
            SetCapsLockState, on
    return
    
    *CapsLock::Send, {ALTDOWN}{SHIFTDOWN}{SHIFTUP}{ALTUP}
    

    编辑:嗯。起初我遇到了+CapsLock 没有切换的问题。试试这个:

    SetCapsLockState, off  ;  may work with SetCapsLockState, AlwaysOff
    +CapsLock::  ;  Shift CapsLock toggles CapsLock state
        if GetKeyState("CapsLock", "T") = 1
            {
            MsgBox CapsLock going off
            SetCapsLockState, off
            }
        else if GetKeyState("CapsLock", "F") = 0
            {
            MsgBox CapsLock going on
            SetCapsLockState, on
            }
    return
    
    *CapsLock::
        MsgBox CapsLock pressed without shift
        Send, {ALTDOWN}{SHIFTDOWN}{SHIFTUP}{ALTUP}
    return
    

    看看是否按shift+capslock触发了capslock MsgBox

    HTH,让我们知道,YMMV

    【讨论】:

    • 感谢您。不幸的是,结果是一样的:有时 CapsLock 直到我按两三下才会切换语言。
    【解决方案2】:

    这是来自互联网上的某个地方:

    SetCapsLockState, off
    +Capslock::CapsLock
    *Capslock::LangSwitch(1)
    *Capslock up::LangSwitch(1)
    
    LangSwitch( iKeyDownUp=0 )
    {
        static tickLast
        IfEqual,iKeyDownUp,1
        {   tickLast=%A_TickCount%
            return
        }
        IfEqual,iKeyDownUp,2
            If( A_TickCount-tickLast>200 )
                return
    
        HKL:=DllCall("GetKeyboardLayout", "uint",GetThreadOfWindow(), "uint")
    
        HKLnum:=DllCall("GetKeyboardLayoutList","uint",0,"uint",0)
        VarSetCapacity( HKLlist, HKLnum*4, 0 )
        DllCall("GetKeyboardLayoutList","uint",HKLnum,"uint",&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("GetLocaleInfo","uint",HKL>>16,"uint",LOCALE_SENGLANGUAGE, "str",sKbd, "uint",260)
        DllCall("GetLocaleInfo","uint",HKL & 0xFFFF,"uint",LOCALE_SENGCOUNTRY, "str",sCountry, "uint",260)
        traytip,%sKbd%,%sCountry%
        SetTimer,REMOVE_TOOLTIP,500 ;0.5 second
        return
    REMOVE_TOOLTIP:
        SetTimer,REMOVE_TOOLTIP,off
        traytip
        return
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 2013-02-13
      • 2023-03-10
      • 1970-01-01
      • 2011-07-17
      • 2020-10-30
      • 2021-11-18
      • 2017-02-08
      • 1970-01-01
      相关资源
      最近更新 更多