输入法中英文状态悬浮提示,利用AutoHotkey实现【转载】+我的使用感受

下载网址

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键才会提示的麻烦,用这个办法只要单击鼠标就可以提示输入法状态,非常实用方便!

你可能感兴趣的:(冲浪小技巧,windows)