AutoHotkey
安装之后新建一个txt文件,把代码复制进去,另存为.ahk文件,双击运行这个ahk文件即可。
输入法状态提示,中文状态提示“中”,英文状态提示“EN”,切换中英文状态的时候,或者用鼠标切换到另一个编辑窗口的时候再次提示,循环如此。
以下为@liuyukuan提供的代码
[AHK]输入法状态提示,中文状态提示“中”,英文状态提示“EN”_liuyukuan的博客-CSDN博客
;功能:输入法状态提示
;环境:win10+搜狗输入法,输入法状态切换用默认的shift键。
;作者:sunwind
;时间:2018年9月1日
;更新链接:https://blog.csdn.net/liuyukuan/article/details/82291632
~Shift::
ToolTip
If (IME_GET()=1)
ToolTip,EN ;shift得反着提示,提示切换后的状态。
else
ToolTip,中
return
~LButton::
If (A_Cursor = "IBeam" ) {
Edit_Mode := 1
} else if(A_Cursor = "Arrow" ) {
Edit_Mode := 0
}
MouseGetPos, , , WhichWindow, WhichControl
WinGetPos,winx,winy,,,%WhichWindow%
ControlGetPos, x, y, w, h, %WhichControl%, ahk_id %WhichWindow%
;~ ToolTip, %WhichControl%`nX%X%`tY%Y%`nW%W%`t%H%
if ( 0 = not_Edit_InFocus())
{
If (IME_GET()=1)
ToolTip,中
else
ToolTip, EN
}
return
~Shift up::
~Lbutton up::
Sleep,1000
ToolTip
return
not_Edit_InFocus(){
Global Edit_Mode
ControlGetFocus theFocus, A ; 取得目前活動窗口 的焦點之控件标识符
return !(inStr(theFocus , "Edit") or (theFocus = "Scintilla1") ;把查到是文字編輯卻不含Edit名的theFucus加進來
or (theFocus ="DirectUIHWND1") or (Edit_Mode = 1))
}
IME_GET(WinTitle="")
;-----------------------------------------------------------
; IMEの状態の取得
; 対象: AHK v1.0.34以降
; WinTitle : 対象Window (省略時:アクティブウィンドウ)
; 戻り値 1:ON 0:OFF
;-----------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)
;Message : WM_IME_CONTROL wParam:IMC_GETOPENSTATUS
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x005,0,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}
按照原代码复制粘贴后发现两个问题:
①中文状态提示的“中”字为乱码,所以改成“CH”
②微软输入法下可正常使用,切换到讯飞输入法时两种状态显示却反了。我把代码中的“EN”和“CH”调换位置后可以正常使用。(原理我也不清楚,反正刚上手的话多试几次,调整正常了就很好用了)
调整后代码如下:
~Shift::
ToolTip
If (IME_GET()=1)
ToolTip,CH ;shift得反着提示,提示切换后的状态。
else
ToolTip,EN
return
~LButton::
If (A_Cursor = "IBeam" ) {
Edit_Mode := 1
} else if(A_Cursor = "Arrow" ) {
Edit_Mode := 0
}
MouseGetPos, , , WhichWindow, WhichControl
WinGetPos,winx,winy,,,%WhichWindow%
ControlGetPos, x, y, w, h, %WhichControl%, ahk_id %WhichWindow%
;~ ToolTip, %WhichControl%`nX%X%`tY%Y%`nW%W%`t%H%
if ( 0 = not_Edit_InFocus())
{
If (IME_GET()=1)
ToolTip,EN
else
ToolTip,CH
}
return
~Shift up::
~Lbutton up::
Sleep,1000
ToolTip
return
not_Edit_InFocus(){
Global Edit_Mode
ControlGetFocus theFocus, A ; 取得目前活動窗口 的焦點之控件标识符
return !(inStr(theFocus , "Edit") or (theFocus = "Scintilla1") ;把查到是文字編輯卻不含Edit名的theFucus加進來
or (theFocus ="DirectUIHWND1") or (Edit_Mode = 1))
}
IME_GET(WinTitle="")
;-----------------------------------------------------------
; IMEの状態の取得
; 対象: AHK v1.0.34以降
; WinTitle : 対象Window (省略時:アクティブウィンドウ)
; 戻り値 1:ON 0:OFF
;-----------------------------------------------------------
{
ifEqual WinTitle,, SetEnv,WinTitle,A
WinGet,hWnd,ID,%WinTitle%
DefaultIMEWnd := DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint)
;Message : WM_IME_CONTROL wParam:IMC_GETOPENSTATUS
DetectSave := A_DetectHiddenWindows
DetectHiddenWindows,ON
SendMessage 0x283, 0x005,0,,ahk_id %DefaultIMEWnd%
DetectHiddenWindows,%DetectSave%
Return ErrorLevel
}
使用感受:
比起微软输入法自带的中英文提示,省去了按Shift键才会提示的麻烦,用这个办法只要单击鼠标就可以提示输入法状态,非常实用方便!