经常需要在日语、英语和中文之间来回切换输入法的语言,中英输入倒是很容易,微软的中文输入法也有英语词库,但是切换日语就很难受了,需要频繁地用CTRL+SHIFT+1和CTRL+SHIFT+2,效率有点低,请问有什么好方法能减少多语言输入时的繁琐?
用 CapsWriter Offline ,把一部分输入任务交由语音输入来做。
试着写了一个AHK脚本,通过CapLocks键控制日语的切换,其实挺容易解决的。
代码如下:
#Requires AutoHotkey v2.0
; 全局变量记录状态
Global PrevLayout := 0 ; 用于记录按下 CapsLock 之前的输入法
Global IsJpLocked := false ; 记录当前是否处于 Mode 1(日文锁定状态)
Global JpLayout := 0x04110411 ; 微软日文输入法的 KLID(Keyboard Layout ID)
; 保留 Shift + CapsLock 快捷键,用于真正地切换大小写锁定(以备不时之需)
+CapsLock::SetCapsLockState(!GetKeyState("CapsLock", "T"))
; 劫持 CapsLock 键
CapsLock:: {
Global PrevLayout, IsJpLocked, JpLayout
currentLayout := GetCurrentLayout()
; 【动作 1:按下 CapsLock 瞬间】
; 如果当前没有处于“模式1”的锁定状态,我们需要记住它,以便之后恢复
if (!IsJpLocked) {
PrevLayout := currentLayout
}
; 立即切换到日文输入法(为了让接下来的字母键输入直接变成日文)
SetLayout(JpLayout)
; 等待用户松开 CapsLock 键
KeyWait("CapsLock")
; 【动作 2:松开 CapsLock 瞬间】
; A_PriorKey 会记录上一个被按下的按键。
; 如果松开时,上一个按键就是 CapsLock,说明期间没有按过其他键。
if (A_PriorKey = "CapsLock") {
; 模式 1:仅仅按了一下 CapsLock(切换/恢复模式)
if (IsJpLocked) {
; 已经是日文锁定状态,再次按下则恢复之前的输入法
SetLayout(PrevLayout)
IsJpLocked := false
} else {
; 第一次按下,锁定为日文输入法
IsJpLocked := true
}
} else {
; 模式 2:按住 CapsLock,同时敲击了其他键(临时输入模式)
; 输入已经完成,松开后应当恢复到原来的输入法
; (前提是之前没用模式1锁定日文。如果本来就是模式1锁定,保持日文即可)
if (!IsJpLocked) {
SetLayout(PrevLayout)
}
}
}
; --------------------------------------------------
; 底层辅助函数:获取当前活动窗口的输入法 KLID
; --------------------------------------------------
GetCurrentLayout() {
hWnd := WinActive("A")
if !hWnd
return 0
threadId := DllCall("GetWindowThreadProcessId", "Ptr", hWnd, "Ptr", 0, "UInt")
return DllCall("GetKeyboardLayout", "UInt", threadId, "Ptr")
}
; --------------------------------------------------
; 底层辅助函数:向当前活动窗口发送切换输入法的请求
; --------------------------------------------------
SetLayout(layout) {
hWnd := WinActive("A")
if !hWnd
return
; 0x0050 = WM_INPUTLANGCHANGEREQUEST
PostMessage(0x0050, 0, layout, , "ahk_id " hWnd)
}
脚本在私人环境下可自用,但是很多场合不允许私自安装外来软件,只能去适应已有的条件
将英文输入兼并到中文输入法,用shift切换,日语则使用独立的输入法,如微软拼音
我倒没有这样的困扰,话说连诸如Python、C语言、autohotkey这些编程语言都不让用的环境是否太严了点?
