# Auohotkey 脚本求助

**URL:** <https://meta.appinn.net/t/topic/34238>\
**Category:** AutoHotkey\
**Created:** [2022 年7 月 14 日 03:36 UTC](https://meta.appinn.net/t/topic/34238 "2022-07-14T03:36:57Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

作者： ![kiki\_lin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/kiki_lin/32/27833_2.png) [@kiki\_lin](https://meta.appinn.net/u/kiki_lin)\
发布日期： [2022 年7 月 14 日 03:36 UTC](https://meta.appinn.net/t/topic/34238/1 "2022-07-14T03:36:57Z")

</div>

最近研究AutoHotkey脚本，写了一个关于输入法切换的脚本，在默认英文输入法状态下，转为中文输入状态，并输入已打出的字母，为了减少想输入中文打出来却是英文字母的麻烦。  
 ![动画](https://meta.appinn.net/uploads/default/original/3X/5/4/54eb537ad1afea53e69c8fee73ea6c3b91e8019d.gif)  
脚本快捷键Shift+space，默认微软拼音输入法，Ctrl+Space 切换中英。  
但有个bug出现频率挺高的，就是莫名地把已输入的字母转换成大写，不知道哪里出了问题，求各位大佬帮忙看看。非计算机相关专业出身，代码网上东拼西凑的，请见谅。

 ![image_240](https://meta.appinn.net/uploads/default/original/3X/9/5/95c9750c514de87b981c4584c85319f8844ecebc.png)

```auto
;切换中文输入法时，自动输入已输入字符
+Space::
    Send {ShiftDown}{Home}{ShiftUp}
    Sleep 50
    Send ^c
    sleep 50
    Haystack = %clipboard%
    
    ;;字符串反转
    ReverseString(ByRef String)
    {
        String .= "", DllCall("msvcrt.dll\_wcsrev", "Ptr", &String, "CDecl")
    return String
}
sleep 50
ReverseHaystack = % ReverseString(ByRef Haystack)
RegExMatchPos = % RegExMatch(ReverseHaystack, "i)[^a-z]")
HaystackLen = % StrLen(Haystack)
if (RegExMatchPos = 1) { ; =1时表示末尾不是字母
Send {Right}
Sleep 50
Send {Ctrl down}{space}{Ctrl up}
} else {
    FoundPos = % HaystackLen - RegExMatchPos ;获取非字母字符位置
    if (HaystackLen - FoundPos > 0) {
        num :=1
        ; SubStr1 = % SubStr(Haystack, 1, FoundPos + 1)
        SubStr2 = % SubStr(Haystack, FoundPos + 2)
        Send {Right}
        Loop {
            Send {BackSpace}
            num += 1
        }Until (num = HaystackLen - FoundPos)
        ; Send % SubStr1
        Send {Ctrl down}{space}{Ctrl up}
        Sleep 50
        Send % SubStr2
    } else {
        Send {Ctrl down}{space}{Ctrl up}
        Sleep 50
        Send % Haystack
    }
}
sleep 100

return

```

---

<div class="post-metadata">

作者： ![dog](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/dog/32/18667_2.png) [@dog](https://meta.appinn.net/u/dog)\
发布日期： [2022 年7 月 14 日 03:54 UTC](https://meta.appinn.net/t/topic/34238/2 "2022-07-14T03:54:29Z")

</div>

我之前写过同样功能的，你可以参考一下：

> [@求Windows端能舒服地输入英文符号的办法](https://meta.appinn.net/t/topic/26834/54):
>
> 在主站的讨论中，非常认同以下两人看法，所以试着用ahk写了段代码，实现了一键转错输的拼音或符号为中文的。 用的是appskey，没有这个键的建议换成右ctrl。 使用效果见图，用起来还是非常爽的瞬间完成，而且appskey就在右ctrl边上，盲摸过去就很准确舒服了。 [测试] 可以看到不止Pinyin，逗号句号等英文符号也适用…… 代码如下： AppsKey:: send , +{Home} sleep, 20 send, ^c send,{shift} ;通过shift切换中文，可自行修改 if (StrLen(Clipboard)) \< 20 { sendinput,%Clipboard% } else { Clipboard1 := SubStr(Clipboard, 1, -20) Clipboard2 := SubStr(Clipboard, -19) sendinput,{Text}%Clipboard1% s…

还有另一个坛友的改进版：

> [@关于使用脚踏板切换中英输入法的方案详述](https://meta.appinn.net/t/topic/26904/50):
>
> 受你的启发，我改了一个自我感觉更顺畅的方法，按输入法切合键是切换输入法，连按两次是拼音转中文，并且用正则处理了汉字和字母夹杂的情况 SetCapsLockState, AlwaysOff ; capslock 按一次是切换中英文，按两次是输错了重新输入。 CapsLock:: if Caps\_presses \> 0 { Caps\_presses += 1 SetTimer Capskey, 200 return } Caps\_presses = 1 SetTimer Capskey, 200 return Capskey: SetTimer Capskey, off if Caps\_presses = 1 { SendInput,+ } else if Caps\_presses = 2 { tocorrect() } Caps\_presses = 0 return tocorrect() { SendInput, +{Home} Sleep, 10 SendInput, ^c Sleep, 10 SendInput,+ …

---

<div class="post-metadata">

作者： ![kiki\_lin](https://meta-edge.appinn.com/user_avatar/meta.appinn.net/kiki_lin/32/27833_2.png) [@kiki\_lin](https://meta.appinn.net/u/kiki_lin)\
发布日期： [2022 年7 月 14 日 06:49 UTC](https://meta.appinn.net/t/topic/34238/3 "2022-07-14T06:49:49Z")

</div>

谢谢，正则加个"$"原来可以从后向前匹配， ::我还费劲的反转再匹配，用坛友的方法流畅多了。
