问题提出
在敲代码写注释,或者编写包含公式的文档的时候,经常需要中英文切换,有时多按或少按了一下Shift,还要看一眼右下角状态栏,就很麻烦,能不能在中英文切换的时候实现类似大小写切换的屏幕显示效果呢?
我搜了一下,找到了一个名叫 AutoHotkey 的工具,来看看。
AutoHotkey介绍
AutoHotkey 是一款 windows 平台下的热键脚本语言程序,能够通过自定义脚本实现一些重复性强没技术含量的自动化操作,例如:重映射键盘、操作窗口、字符串处理、设置快捷键等,而且占用资源极小,仅 3M 大小。有人称它为Windows 自动化效率神器。
可以访问相关资料:初学者向导
参阅:V2官方文档
巨坑提示:autohotkeyV1版本和V2版本完全不兼容!!!!,现在网上还有大量V1的教程,如果我们安装了V2,却使用V1的语法,那就会报错!!!
看看它的语法:
AutoHotkey
;分号是注释的意思
;快捷键 alt + n 打开记事本,感叹号表示alt键,
!n::Run notepad
例程
AutoHotkey
;快捷键 win + space 打开百度网站
#space::Run www.baidu.com
V1例程
AutoHotkey
;按下 win + m 显示一个弹窗,注意这是v1的语法,V2不兼容
#m::
MsgBox, This one too.
return
例程
AutoHotkey
;按下 ctrl + n 打开记事本
^n::Run Notepad
;快捷键 alt + q 启动位于 D:\software\QQ.exe 的 QQ 程序
!q::Run D:\software\QQ.exe
程序源码及注释
程序逻辑:
输入法状态只有3种情况:小写英文,大写英文,中文。(abc ,ABC,中)
注意,下面的 isEnglishMode()
函数可能不适应于搜狗输入法,可能只适用于微软拼音输入法,如果要使用搜狗拼音输入法,需要改一个参数。
AutoHotkey
#Requires AutoHotkey v2.0
DetectHiddenWindows True
; 定义全局变量用于控制提示窗口
global isShowing := false
global MyGui
; Shift键 - 显示当前模式
Shift::{
If (!isEnglishMode()) {
showtext("abc")
} else {
showtext("中")
}
return
}
; CapsLock键 - 切换大小写并处理中英文模式
CapsLock::{
If (GetKeyState("CapsLock", "T")) {
; 如果CapsLock激活,关闭它并处理中英文模式
SetCapsLockState 0
If (!isEnglishMode()) {
; 如果当前是中文模式,切换到英文模式
Send "^{Space}"
showtext("abc")
}
} else {
; 否则,激活CapsLock
SetCapsLockState 1
showtext("ABC")
}
return
}
; 判断当前输入法是否为英文模式
isEnglishMode() {
hWnd := winGetID("A")
result := SendMessage(
0x283, ; WM_IME_CONTROL消息
0x001, ; 获取转换模式
0, ; 不需要lParam
, ; 不指定Control
"ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", hWnd, "Uint")
)
return result == 0 ; 返回值为0表示英文模式
}
; 显示提示文本
showtext(str) {
global isShowing, MyGui
; 如果当前有提示显示,销毁并创建新的提示
if (isShowing) {
MyGui.Destroy()
}
y := A_ScreenHeight - 480
MyGui := Gui("+AlwaysOnTop +Disabled -Caption -SysMenu +Owner +LastFound")
MyGui.SetFont("s30 c800080 w700", "Verdana")
WinSetTransparent 100
MyGui.Add("Text", "BackgroundTrans", str)
MyGui.Show("NoActivate xCenter NA Y" y)
; 设置定时器,在500ms后关闭提示
isShowing := true
SetTimer(DestroyTip, 800) ; 使用v2.0语法
}
; 关闭提示窗口
DestroyTip() {
global isShowing, MyGui
if (isShowing) {
MyGui.Destroy()
isShowing := false
}
}
更多功能
下面两段代码实现切换到中文模式、切换到小写英文模式的功能:
AutoHotkey
; 右Alt键 - 切换到中文模式
RAlt::{
If (GetKeyState("CapsLock", "T")) {
; 如果CapsLock激活,关闭它
SetCapsLockState 0
}
If (isEnglishMode()) {
; 如果当前是英文模式,切换到中文模式
Send "^{Space}"
showtext("中")
} else {
; 如果已经是中文模式,仅显示提示
showtext("中")
}
return
}
; 右Ctrl键 - 切换到小写英文模式
RControl::{
If (GetKeyState("CapsLock", "T")) {
; 如果CapsLock激活,关闭它并处理中英文模式
SetCapsLockState 0
If (!isEnglishMode()) {
; 如果当前是中文模式,切换到英文模式
Send "^{Space}"
}
showtext("abc")
} else {
; 否则,检查当前模式并进行适当的操作
If (isEnglishMode()) {
showtext("abc")
} else {
; 如果当前是中文模式,切换到英文模式
Send "^{Space}"
showtext("abc")
}
}
return
}
下面的代码实现一些重映射功能:
AutoHotkey
F12::Run "www.weiyeji.com"
;按下f4,输出$
F4::{
SendText "$"
return
}
;两个反引号表示一个反引号,这是转义字符
;按下F3输出一个反引号
F3::SendText "``"
实现autohotkey脚本时,务必注意版本问题。