使用 AHK 在 VS Code 中根据上下文自动切换输入法状态
平常在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 中根据上下文自动切换输入法状态的更多相关文章
- 原生 JS 实现 VS Code 自动切换输入法状态!这次没有AHK
上一篇文章:使用 AHK 在 VS Code 中根据上下文自动切换输入法状态 给出一个使用 ahk 在 VSCode 自动切换输入法的方法.不过这个方法实际上很蹩脚,一点都不优(zhuang)雅(bi ...
- 在 Visual Studio 等编辑器/IDE中自动切换输入法,不需要手动的有没有?
使用Visual Studio写代码,经常遇到的一个问题就是切换中文输入法麻烦,输入完注释//,要切换到中文,输入完引号,要输入中文,然后还需要切换回来,有没有? 有时候中文输入法忽然失效有没有?明明 ...
- Android借助Handler,实现ViewPager中页面的自动切换(转)
在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图: 实现一个自动 ...
- tab切换效果 网站中的图片自动切换
网站中的图片自动切换 今天上一套tab切换效果的代码 动图就自己实现吧! 下面贴HTML代码,大体分两部分,图片div和按钮div,代码很容易看懂~ <!DOCTYPE html> < ...
- VS Code - Vim 插件自动切换输入法
前言: 在使用 Linux 的过程中,vim 是一个不错的编辑器,以至于多数人将其用成了习惯,在没有 vim 的环境下还是习惯用 vim 的快捷键来编辑文本.所以便有开发者们为众多的 IDE 和文本编 ...
- 【转载】VS Code 中的代码自动补全和自动导入包
原文连接:https://maiyang.me/post/2018-09-14-tips-vscode/ VSCode 必须安装以下插件: 首先你必须安装 Golang 插件,然后再给 Go 安装工具 ...
- VS Code中python代码自动格式化 代码自动检查
VS Code菜单栏中依次打开 File—Preferences—Settings,搜索框中搜索“python.formatting.provider”, 然后在下拉菜单中选择autopep8,yap ...
- VS Code 中的LaTeX自动保存问题
最近更新了VS Code,编辑LaTeX文档是出现了一个很恼人的问题:只要文档一改动,立马就Build,在更新之前是没有这个问题的. 解决方案如下:在设置里找到Auto Build: Run选项,将其 ...
- 浅析:点击父控件时,子控件中的textview自动进入选中状态
原因:父控件属性android:clickable="true",而textview之类的自控件默认不可点击,没有独立的点击监听,这样选中父控件时,textview之类的子控件也进 ...
随机推荐
- 异步回调实现- Guava Retryer
为什么要使用重试利器Retryer 在实际开发中我们经常会遇到需要轮询查询一个接果,实现轮询的方式有很多种,我们经常要写许多代码,有时还会怕写出的代码有bug,如果已经有轮子了,我们就没必要重复造轮子 ...
- Nginx http重定向https
SSL证书申请的腾讯的,配置好证书后,直接监听80端口转发443就ok了 转发语句:rewrite ^/(.*) https://$server_name:443$request_uri? perma ...
- ANT中的copy和move标签
Copy标签 该标签用于文件或文件集的拷贝,其属性如下: file 表示源文件. tofile 表示目标文件. todir 表示目标目录. overwrite 表示指定是否覆盖目标文件,默认值是不覆盖 ...
- byte溢出栗子
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11634402.html byte溢出测试: byte b1 = (byte) 127; byt ...
- 垃圾陷阱 && [NOIP2014 提高组] 飞扬的小鸟
#include<bits/stdc++.h> using namespace std; int d,n,dp[1010]; struct node{int t,f,h;} a[1010] ...
- PHP面试常考内容之面向对象(3)
PHP面试专栏正式起更,每周一.三.五更新,提供最好最优质的PHP面试内容.继上一篇"PHP面试常考内容之面向对象(2)"发表后,今天更新面向对象的最后一篇(3).需要(1),(2 ...
- Solution -「CF 1391E」Pairs of Pairs
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的无向图,在其上找到一条包括不少于 \(\lceil\frac{n}2\rceil\ ...
- JDK中线程中实现同步等待闭环的一种方式
实际Thread类自带的join方法就实现了线程同步等待,具体可以通过案例实践,如下: 本文的重点不是join,而是另一种设计的同步等待实现,涉及的关键类有:Thread.Runable.Callab ...
- Wi-Fi DFS与TPC介绍
DFS与TPC是wifi认证的其中一项测试内容,如果不需要DFS功能,可以不进行测试,但是某些属于DFS频段的wifi信道则不允许使用. 1. 什么是WIFI Auto DFS? 通俗的说就是:躲雷达 ...
- 昨天面试被问到的 缓存淘汰算法FIFO、LRU、LFU及Java实现
缓存淘汰算法 在高并发.高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对. 第一次请求时把计算好的结果存放在缓存中,下次遇到同样的请求时,把之前保存在缓存中的数据直接拿来使用. 但是, ...