如何把 Windows 的大写锁定改为语言切换?
我最近开始用 Windows,由于前面两三年都是 Mac,现在用Win 的感觉非常难受,主要是键盘布局。
前面是序言,关于修改方法可以直接跳转到正文
Win 和 Mac 键盘布局最大的差异是对语言切换的理解。
我不知道Win究竟是出于什么思想,“竟然” 单独给大小写切换功能单独设置了一个按键,是遗产吗?或者是出某种来自远古的记忆?
我真的很好奇。
Mac 上通过 中/英 按键切换,但是 Windows 使用 shift 或者 Ctrl 切换语言。
两种截然不同的操作方式带来的迁移的成本很高,对与更改键盘布局的想法不是一天两天了。
先列一下各自的定义:
WIN
CapsLock:单击=锁定大写,长按=无;Shift/Ctrl/Ctrl-空格:单击=切换语言,长按=当前大写
MAC
中/英:单击=切换语言,长按=锁定大写Shift:单击=无,长按=当前大写
我最开始把通过设置把 Shift 改成:长按大写,单击切换语言。但是发现有些时候我会误触,把 CapsLock 当作 Shift,其实我也不知到是我误触还是键盘反应慢,总之就是我希望切换语言的时候,语言没有被更改。
然后又尝试通过修改注册表,把 CapsLock 映射 Ctrl,这种方式比较奇怪,因为注册表不能映射组合键,还是丢失了一个键。如果是键盘坏了,这样映射还行。另外,注册表只能处理点击,因为注册表不能判断是长按还是点击。
后来我不得不寻求更合适的方法,帮助我更优雅地从 Mac 过度到 Win,最终我通过 AutoHotkey 实现了。
正文
安装 AutoHotkey: https://autohotkey.com/download/ahk-v2.exe
注意,我使用的是 2.0 版本
创建文件 keyboard.ahk 文件,文件名称任意
这个文件是案例,不是最终的,最终的版本在下方
; 禁用原生 CapsLock 功能
SetCapsLockState("AlwaysOff")
; 全局变量保存 CapsLock 状态
CapsLockState := false
CapsLock::{
; 等待按键释放,超时时间 0.45 秒
result := KeyWait("CapsLock", "T0.45")
if (!result) {
; 长按:切换大小写锁定
global CapsLockState
CapsLockState := !CapsLockState
SetCapsLockState(CapsLockState ? "On" : "Off")
; 显示状态提示
ToolTip("CapsLock: " . (CapsLockState ? "ON" : "OFF"))
SetTimer(() => ToolTip(), -1000)
; 等待按键完全释放
KeyWait("CapsLock")
} else {
; 短按:切换输入法
Send("^{Space}")
}
}
然后双击这个文件就可以了,会出现一个对话框,只要不是报错就表示这个文件已经被配置了。
这个配置可以实现类似于 Mac 的输入方式:
将 CapsLock 改为语言切换
将 Shift 改为当前大写,长按没有功能。
实际上最重要的就是这一句:
CapsLock::{
Send("^{Space}")
}
将 CapsLock 键映射为 Ctrl-空格,其他都是在处理长按和短按的逻辑而已。
但是,上面的代码有一个问题:如果当前是大写的时候更改语言后还是大写。
另外,我希望代码逻辑更偏向于函数式,这样比较一目了然;我希望有声音提示和工具提示,因为大多数时候我都是在用 Vim,不希望有任何不必要的动作打断我操作的连贯性。
于是就有了下面的代码:
; 禁用原生 CapsLock 功能
SetCapsLockState("AlwaysOff")
; 全局变量保存 CapsLock 状态
CapsLockState := false
CapsLock::{
; 第一步:判断是长按还是短按
; 等待按键释放,超时时间 0.45 秒
isShortPress := KeyWait("CapsLock", "T0.45")
; 第二步:根据按键类型执行对应逻辑
if (isShortPress) {
; ===== 短按逻辑 =====
HandleShortPress()
} else {
; ===== 长按逻辑 =====
HandleLongPress()
; 等待按键完全释放
KeyWait("CapsLock")
}
}
; 短按处理函数:切换输入法
HandleShortPress() {
; 切换输入法
Send("^{Space}")
SetCapsLockState("Off")
; 稍等一下让切换生效
Sleep(100)
; 获取切换后的状态
SetTimer(() => ToolTip(), -1200)
; 提示音
SoundBeep(600, 80) ; 中文输入法
}
; 长按处理函数:切换大小写锁定
HandleLongPress() {
global CapsLockState
if (CapsLockState) {
; 当前开启 → 关闭
CapsLockState := false
SetCapsLockState("Off")
; ToolTip(" CapsLock: OFF (小写模式)`n" . langInfo)
ToolTip(" CapsLock: OFF (小写模式)`n")
SoundBeep(400, 100) ; 低音表示关闭
} else {
; 当前关闭 → 开启
CapsLockState := true
SetCapsLockState("On")
; ToolTip(" CapsLock: ON (大写模式)`n" . langInfo)
ToolTip(" CapsLock: ON (大写模式)`n")
SoundBeep(800, 100) ; 高音表示开启
}
; 1.5秒后清除提示
SetTimer(() => ToolTip(), -1500)
}
; 获取CapsLock状态显示
GetCapsLockStatus() {
if (GetKeyState("CapsLock", "T")) {
return " 大写锁定: 开启"
} else {
return " 大写锁定: 关闭"
}
}
; 添加启动时显示当前状态的快捷键 (Ctrl+CapsLock)
^CapsLock::{
capsStatus := GetCapsLockStatus()
ToolTip(" 当前状态`n" . capsStatus . "`n`n 提示:`n• 短按CapsLock: 切换输入法`n• 长按CapsLock: 切换大小写`n• Ctrl+CapsLock: 显示此状态")
SetTimer(() => ToolTip(), -3000)
}
好了,现在这个代码基本就是我觉得比较好用的了:
- 语言切换时有声音提示和工具提示
CapsLock的设置- 英文模式下:
- 长按是大写锁定,再次长按是小写
- 点击是切换语言
- 中文模式下:
- 长按是大写锁定,再次长按是中文
- 点击是切换语言
- 英文模式下:
Ctrl-CapsLock是工具提示,我准备加一下 vim 的东西,这里就不写了。
如何把 Windows 的大写锁定改为语言切换?的更多相关文章
- js实现判断大写锁定是否开启(转)
转载地址:http://www.cnblogs.com/xiaoao808/archive/2008/07/31/1257624.html 在用户登录输入密码时,常常会有因为大写锁定开启而造成输入密码 ...
- Java将一个字符串的首位改为大写后边改为小写的实现,String
Java将一个字符串的首位改为大写后边改为小写的实现,String 思路: 获取首字母, charAt(0) substring(0,1) 转成大写 toUpperCase() 转大写hellO=== ...
- jquery插件--在input下输入密码时提示大写锁定键
//密码大写输入提示 function capitalTip(id){ $('#' + id).after('<div class="capslock" id="c ...
- 发布一个在Web下输入密码时提示大写锁定键的Jquery插件
功能介绍:在Web下输入密码时提示大写锁定键,封装成jq插件方便有需要的同学!使用:$("#txtPWD").capsLockTip();截图预览:代码(2012-05-03 10 ...
- js实现密码输入框对开启键盘大写锁定的提示(IE浏览器下有自动识别提示则不执行(用IE自带效果即可))
代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- 基于Windows Azure 安装 SharePoint 2010简体中文语言包
在Windows Azure上安装的Windows Server默认是英文版本的,当时安装的SharePoint也是英文版的,为方便使用,决定安装中文的语言包,具体过程如下: 1. 安装 Window ...
- 在Windows Phone项目中调用C语言DLL
在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的 ...
- 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题
原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...
- 【算法】矩阵填数,深度优先搜索(DFS),Pascal改C语言
面向对象的上机实验 题目 以下列方式向 5*5 矩阵中填入数字.设数字i(1=<i<=25),则数字i+1 的坐标位置应为(E, W).(E, W)可根据下列关系由(x,y)算出: 1)( ...
- Windows下Nexus 5 改user模式为debug模式
博客链接:http://blog.csdn.net/qq1084283172/article/details/52337241 在学习Android软件安全的过程中,经常要用到Android的动态调试 ...
随机推荐
- Win10环境安装Anaconda(3-2021.05)+Tensorflow(2.6)
Win10环境安装Anaconda(3-2021.05)+Tensorflow(2.6) 在学习机器学习的过程中会用到许多Python库,例如tensorflow.pandas等,用到的时候单独去 ...
- 数栈SQL优化案例:OR条件优化
本文整理自:袋鼠云技术荟 | SQL优化案例(2):OR条件优化 数栈是云原生-站式数据中台PaaS,我们在github上有一个有趣的开源项目:https://github.com/DTStack/f ...
- C# 列出所有双色球的组合
using System; class Program { static void Main(string[] args) { int[] redBalls = new int[33]; for (i ...
- mac如何卸载飞连
当我们在[应用程序]下面把飞连移到废纸篓时,会提示被锁定无法删除 我们需要先把软件解锁,执行以下命令, 再移到废纸篓即可 sudo /usr/bin/chflags -R noschg /Applic ...
- MySQL 14 count(*)这么慢,我该怎么办?
count(*)的实现方式 在不同的MySQL引擎中,count(*)有不同的实现方式: MyISAM引擎把一个表的总行数存在磁盘上,执行count(*)时能直接返回总行数,效率很高: InnoDB引 ...
- API自动化测试平台,提高API测试效率
RestCloud API自动化测试平台可根据API输入输出参数自动生成和保存测试用例,自动对API的参数边界进行测试,根据测试结果输出测试报告可全面提升API的测试效率.API自动化测试平台同时支持 ...
- Django实战:基于Django和openpyxl实现Excel导入导出功能
一.openpyxl 介绍 openpyxl 是一个用于读取和写入 Excel 2010 xlsx/xlsm/xltx/xltm 文件的 Python 库.使用场景包括: 数据分析:从 Excel 文 ...
- 性能优化:两条SQL索引优化,CPU占用率从40%降至25%
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...
- Win10正式版搜索框不能用的问题
有一位雨林木风官网的用户反馈说,他使用的win10正式版电脑的任务栏上搜索框无法正常使用,搜索不了文件的问题.下面,ylmf 系统小编分享具体的解决方法,有出现这个问题的小伙伴可以一起来看看了. 方法 ...
- 为什么i++不是原子操作?一个让无数并发程序崩溃的“常识”
原子性:不可分割的操作 private int count = 0; public void test() { List<Thread> ts = new ArrayList<> ...