需求
win11下的微软拼音输入法还是比较好用的,相对以前常用的搜狗输入法来说,资源占用少,没广告。但是有个对我来说致命的问题,就是不知道从哪个版本开始,由 /
键输出中文顿号,变成了 \
输出,这就极其让人不适了,甚至一度让我想卸载这个输入法。
因此,需要解决中文顿号(、
)的输入问题,可以考虑使用 AHK,强行使用 /
输出中文顿号。
代码
优快云 的文章模板缺少对 AutoHotkey 代码的渲染能力,下述代码的颜色大家将就看看。
;====================================================================
; 调整微软拼音输入法,用 / 输出中文顿号 、
;====================================================================
is_chinese_mode(){
hWnd := WinGetID("A")
origin_detect_hidden_window := A_DetectHiddenWindows
DetectHiddenWindows(True)
result := SendMessage(
0x283, ; Message : WM_IME_CONTROL
0x001, ; wParam : IMC_GETCONVERSIONMODE
0, ; lParam : (NoArgs)
, ; Control : (Window)
"ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint") ; 获取当前输入法窗口句柄
)
DetectHiddenWindows(origin_detect_hidden_window)
; 微软拼音(英-中,新/旧,新旧/新旧)0/1024-1/1025
return (result == 1 or result == 1025)
}
$/::{
if(is_chinese_mode()){
Send("\")
}else{
Send("/")
}
}
这段代码有几个地方值得注意:
- 核心逻辑是获取当前输入法的中英文状态,这个经过多轮搜索,最终确认通过
SendMessage()
函数来实现(参考1)。这是一个类似 windows 的系统函数,里面的参数具体值在微软网站根本找不到,比如IMC_GETCONVERSIONMODE
对应的值是0x001
,也许安装个 Visual Studio Community 再直接查找相应的头文件定义可以找到。 - 想要成功获取当前输入法窗口句柄,必须开启
DetectHiddenWindows
,否则找不到 SendMessage()
函数的返回值有多种可能,必须根据实际情况进行处理。- 最终步骤是通过截取
/
键来实现,这里有个问题,就是英文模式下,若直接输出原字符,会导致 AHK 再一次截获到/
键,于是再一次启动该热键,从而进入死循环。为避免这种情况,必须使用键盘钩子,即加个$
符号。(参考2)