平常在VS Code打公式,中英文切换一直狂点 Shift 手都快按断了,于是试图用 AutoHotKey 搞一些自动切换输入法程序,让它根据当前输入环境自动切输入法。

之前在网上搜到的是切换键盘的(微软拼音和美式键盘),但是我的电脑上只有微软拼音。一开始搜不到简单易懂的切换中英文的方法,能搜到的只有一个日本人写的 AHK V1 版本,但基本看不懂。或许最好的方法是找到接口,然后直接切中英文,于是开始一通乱搜,最终用 AHK V2 + Ultra IME Toggler 插件 实现了功能

检测中英文状态的接口

转机在这里,一通乱搜找到了这个

这是用 AutoHotKey V2 版本写的,可读性要比 V1 好些。一番尝试,最终找到了判断当前输入法中英文的核心代码,如下所示

DetectHiddenWindows True
isEnglishMode(){
hWnd := winGetID("A")
result := SendMessage(
0x283, ; Message : WM_IME_CONTROL
0x001, ; wParam : IMC_GETCONVERSIONMODE
0, ; lParam : (NoArgs)
, ; Control : (Window)
; Retrieves the default window handle to the IME class.
"ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
)
; 返回值是0表示是英文模式,其他值表明是中文模式
return result == 0
}

这一段代码使用 SendMessage 来获得输入法的状态,其中:

  • 0x283 信息代表的是 WM_IME_CONTROL ,即“控制输入法”;
  • 0x001 对应的信息是 IMC_GETCONVERSIONMODE ,即“拿到输入法中英文状态”。
  • 另外用 winGetID 拿到窗口。

SendMessage() 最后返回 0 或者 1 ,分别代表中英文模式。

然后只要根据返回值,就可以判断中英文模式了。能判断了就好办,可以根据需要发送按键来切中英文了。

去掉注释后(就是分号 ; 后面的部分),代码如下,是不是很简单?

DetectHiddenWindows True
isEnglishMode(){
hWnd := winGetID("A")
result := SendMessage(
0x283, 0x001, 0,, "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
)
return result == 0
}

后面可以加上类似这种代码,如下面的示例就是一个“强制左 Shift 切成中文”的方法:

LShift::{
if(isEnglishMode())
Send "{Shift}"
}

切换中英文状态的接口

接下来更进一步,能不能直接用 WinApi 控制输入法中英文?

查了好久,最终发现和上面的是邻居:把 0x001 改成 0x002 就是 IMC_SETCONVERSIONMODE ,即控制中英文状态的接口!这个怀疑不同输入法不一样,有的似乎是 0x006 。

然后将 lParam 传一个参数,一般 1025 表示中文,0 表示英文,参考这篇文章。这样执行函数,就能直接设定中英文模式!

如下面就是一个完整的左 Shift 切成中文的 ahk V2 程序,简单粗暴:

LShift::{
DetectHiddenWindows True
hWnd := winGetID("A")
SendMessage(
0x283, ; Message : WM_IME_CONTROL
0x002, ; wParam : IMC_SETCONVERSIONMODE
1025, ; lParam :1025 - CN
,
"ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
)
}

是不是很好用!

与 VS Code 联动!

折腾这个的原意是 免去在 VSCode 上写 \(LaTeX\) 和 markdown 时切换中英文的麻烦 。于是采取简单粗暴的方法:把上述 ahk 程序封装成exe,切成中英文分别写一个。然后写一个扩展!省事一点,调用 HyperScopes 插件拿到当前的 Scopes ,如果检测到公式环境,就自动切成英文,公式外面切成中文,只要调用相应的 exe 即可。

最后成功实现,效果如下图(注意输入法状态):

实测切换的延时大概 0.02s,基本感受不到了。

如果想体验一下测试版,可以从 Github 上或者 蓝奏云-密码7o5t下载 IMEtoCN.exe 和 IMEtoEN.exe ,放到一个特定的文件夹,再将这个文件夹添加到环境变量(可能需要重启计算机),插件市场搜索 Ultra IME Toggler 安装,然后就可以体验了!

来 Github 给个 呀!


原文链接:https://www.cnblogs.com/yf-zhao/p/16018481.html 转载请注明出处!

使用 AHK 在 VS Code 中根据上下文自动切换输入法状态的更多相关文章

  1. 原生 JS 实现 VS Code 自动切换输入法状态!这次没有AHK

    上一篇文章:使用 AHK 在 VS Code 中根据上下文自动切换输入法状态 给出一个使用 ahk 在 VSCode 自动切换输入法的方法.不过这个方法实际上很蹩脚,一点都不优(zhuang)雅(bi ...

  2. 在 Visual Studio 等编辑器/IDE中自动切换输入法,不需要手动的有没有?

    使用Visual Studio写代码,经常遇到的一个问题就是切换中文输入法麻烦,输入完注释//,要切换到中文,输入完引号,要输入中文,然后还需要切换回来,有没有? 有时候中文输入法忽然失效有没有?明明 ...

  3. Android借助Handler,实现ViewPager中页面的自动切换(转)

    在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图:           实现一个自动 ...

  4. tab切换效果 网站中的图片自动切换

    网站中的图片自动切换 今天上一套tab切换效果的代码 动图就自己实现吧! 下面贴HTML代码,大体分两部分,图片div和按钮div,代码很容易看懂~ <!DOCTYPE html> < ...

  5. VS Code - Vim 插件自动切换输入法

    前言: 在使用 Linux 的过程中,vim 是一个不错的编辑器,以至于多数人将其用成了习惯,在没有 vim 的环境下还是习惯用 vim 的快捷键来编辑文本.所以便有开发者们为众多的 IDE 和文本编 ...

  6. 【转载】VS Code 中的代码自动补全和自动导入包

    原文连接:https://maiyang.me/post/2018-09-14-tips-vscode/ VSCode 必须安装以下插件: 首先你必须安装 Golang 插件,然后再给 Go 安装工具 ...

  7. VS Code中python代码自动格式化 代码自动检查

    VS Code菜单栏中依次打开 File—Preferences—Settings,搜索框中搜索“python.formatting.provider”, 然后在下拉菜单中选择autopep8,yap ...

  8. VS Code 中的LaTeX自动保存问题

    最近更新了VS Code,编辑LaTeX文档是出现了一个很恼人的问题:只要文档一改动,立马就Build,在更新之前是没有这个问题的. 解决方案如下:在设置里找到Auto Build: Run选项,将其 ...

  9. 浅析:点击父控件时,子控件中的textview自动进入选中状态

    原因:父控件属性android:clickable="true",而textview之类的自控件默认不可点击,没有独立的点击监听,这样选中父控件时,textview之类的子控件也进 ...

随机推荐

  1. Tomcat下 session 持久化问题(重启服务器session 仍然存在)

    感谢大佬:https://www.iteye.com/blog/xiaolongfeixiang-560800 关于在线人数统计,大都使用SessionListener监听器实现. SessionLi ...

  2. java中的成员变量和局部变量的区别

    成员变量: 在类体里面定义的变量叫做成员变量: 如果在变量有static关键字修饰,就叫作静态变量或类变量: 如果该变量没有static关键字修饰,就叫作非静态变量或实例变量: 局部变量: 方法内定义 ...

  3. squid 代理服务器应用

    squid 代理服务器应用 1.Squid 代理服务器 : Squid 主要提供缓存加速.应用层过滤控制的功能.  代理的工作机制: 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址. 将获得 ...

  4. Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧

    kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...

  5. 一个实用批处理指令制作过程分享:Perforce更新完后打开VisualStudio再编译

    需求来源 笔者从事Unreal游戏客户端工作,使用VisualStudio开发,然后经常干一个事:就是使用Perforce(或svn)拉取最新代码,(一些时间后)拉取完之后然后打开 项目.sln,即V ...

  6. MySQL架构原理之体系架构

    MySQL是最流行的关系型数据库软件之一,由于其体量小.速度快.开源免费.简单易用.维护成本低等,在季军架构中易于扩展.高可用等优势,深受开发者和企业的欢迎,在互联网行业广泛使用. 其系统架构如下: ...

  7. C# 实例解释面向对象编程中的里氏替换原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  8. Python_time库_特定字符串格式的时间、struct_time、时间戳的处理

    time库 时间戳:格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. # time.strptime(),功能:将特定字符串格 ...

  9. 用eclipse写jsp报以下错误

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ tag ...

  10. 【C#基础概念】字节顺序(大端、小端)

    字节顺序,又称端序或尾序(英語:Endianness),在计算机科学领域中,指電腦記憶體中或在数字通信链路中,组成多字节的字的字节的排列顺序. 例如假设上述变量x类型为int,位于地址0x100处,它 ...