百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

超级热键:一学就会简单编程,提升 Windows 效率

bigegpt 2024-08-07 17:36 3 浏览

超级热键可通过简单编程 —— 自动化完成复杂操作,提升效率。

快速上手

本教程需要一个很小的开源软件 ImTip ( 体积 639 KB ),了解 ImTip 请点击:电脑必备:通用输入法状态提示,再也不怕按错,再也不用看右下角

请右键点开 ImTip 托盘菜单,然后点击「管理超级热键」

然后将热键配置改为如下代码,并且勾选「启用超级热键」,再点击「保存」按钮使热键生效。

//大写金额、日期、时间 
["Ctrl+#34;] = function(hFocus){  
	win.dlg.chineseNumber().show();
};

//打开调色器
["Ctrl+#"] = function(hFocus){  
	
	//创建选色器
	var dlg = win.ui.ctrl.pick();
	dlg.show();
	
	//置顶
	win.setTopmost(dlg.hwnd,true); 
};

上面的配置定义了 "Ctrl+#34;,"Ctrl+#" 这两个热键。中括号里是按键名字符串,等号的后面指定要输入的文本或者需要执行的函数对象

以上热键配置将自动转换为以下 aardio 代码,然后编译执行:

//导入超级热键
import key.hotkey; 

//创建超级热键
var superHotkey = key.hotkey(winform);

//批量加载热键配置表
superHotkey.loadTable({

	["Ctrl+#34;] = function(hFocus){  
		win.dlg.chineseNumber().show();
	};
	
	["Ctrl+#"] = function(hFocus){  
		
		var dlg = win.ui.ctrl.pick();
		dlg.show();
		
		win.setTopmost(dlg.hwnd,true); 
	};
});

超级热键配置其实就是一个表对象 ( table )。每个热键配置由等号分隔的键值对组成,等号前面指定热键,等号后面用一个函数指定要执行的代码。多个热键配置使用分号隔开。

如果不会编程没关系,下面会提供可直接复制粘贴的范例,建议先看几个范例 —— 再看一下:aardio 编程语言快速入门——语法速览

下面看一下 Ctrl + $ 热键运行效果:

Ctrl + # 热键运行效果:


超级热键检测规则

1、如果首个按下的键不是控制键,则不必同时按住多个键。如果按下的键是已注册的热键前半部分,则阻止当前按键继续发送。如果继续按键已不符合任何热键,则释放已捕获的按键并按原顺序重新发送。

2、如果首次按住的是控制键( CTRL,ALT,SHIFT,WIN 之一),则必须同时按住多个键才算已完成热键。如果这样同时按住的多个键是一个已完成的热键,但同时又是其他热键的前半部分,则必须放开所有键才会生效。

3、如果注册单个控制键热键,并且加上 @ 前缀,则放开该键(且中间没有按其他键)才算完成热键。

4、超键热键中任何键名都只表示该键名所在的按键,不区分上档键。例如热键 "~hi" 指连续按 3 个键,其中的 ~ 键不必按 Shift + ~。

5、超级热键会检测按键顺序,["Ctrl+Shift"] 与 ["Shift+Ctrl"] 是不同的热键。如果希望不同顺序触发同一个回调函数,则需要添加多个热键配置。

示例:

//按连续按 3 个键,每个键都要放开。
["~AA"] = function(){  
	
};

//按下Shift不放,再按2下Q。
["SHIFT+Q,Q"] = function(){  
	
};

//按下Ctrl不放,再按K, 然后都放开。
["Ctrl+K"] = function(){  
	
};

//按下Ctrl不放,再按2次K。
//因为不是其他热键的前半部分,不需要等待放开。
["Ctrl+K,K"] = function(){  
	
};

//表示按下 Shift 键再放开,中间不按其他键,
//通常不会阻止 Shift 切换输入法状态的默认热键。
["@Shift"] = function(){  
	
};

运行 「aardio 自带范例 > Windows 窗口 > 快捷键 > 超级热键」看下效果:

超级热键回调函数

热键回调函数返回 true 表示允许系统继续发送按键,否则取消该按键,不再继续发送。

例如把斜杠“/”改为顿号的热键配置:

["/"] = function(hFocus){
	var openState,mode = key.ime.state();//
	if( !openState /*&&(mode==3) */ ) return true; 
	key.sendString("、")
};

上面的代码检测到当前不是中文标点就执行 return true 允许系统继续发送按键。

如果热键回调函数返回一个函数对象,则取消该按键不再发送,并在返回函数以后异步执行返回的函数对象。

例如输入法纠错热键配置就是这样做的:

["Ctrl+,"]  = function(hFocus){    
	
	//... 省略其他代码
	
	//通过返回函数异步执行耗时操作
	return function(){ 
		key.combine("SHIFT","HOME");
		key.combine("CTRL","C");
		
		//... 省略其他代码
	};  
};

超级热键基于低级键盘钩子,在热键回调中不允许做耗时操作(在热键回调中返回异步执行的函数则不受限制)。

超级热键配置范例:运行指定程序

//运行计算器
["~calc"] = function(hFocus){
	process.execute("calc.exe")
};

//运行word
["~word"] = function(hFocus){
	var word = com.CreateObject("Word.Application")
	if(word)word.Visible = true; 
};

超级热键配置范例:微软全拼双拼切换

["Ctrl+P"] = function(){ 
	var dpSchemes = tsfInput.getDoublePinyinSchemes(); 
	tsfInput.enableoublePinyinScheme(dpSchemes.default===null); 
}

超级热键配置范例:改键演示

["Ctrl+."] = function(hFocus){  
	key.up("Ctrl"); //先把已经按下的键弹起来
	key.combine("CTRL","A"); //换成别的键,具体看 aardio 库函数文档
	return false; //阻止按键事件
};

超级热键配置范例:取消次选键

[";"] = function(hFocus){
	if( winex.msCandidate.isVisible() ){
		key.send(" ;") 
	} 
	else return true;
};

超级热键配置范例:按 Shift + Back 变 Ctrl + Z

["SHIFT+BACK"] = function(hFocus){
	key.up("SHIFT"); //先把已经按下的键弹起来
	key.combine("CTRL","Z")
};

超级热键配置范例:斜杠“/”改为顿号

["/"] = function(hFocus){
	var openState,mode = key.ime.state();//
	if( !openState /*&&(mode==3) */ ) return true; 
	key.sendString("、")
};

超级热键配置范例:调整音量

//增加音量
["Ctrl+F6"] = function(hFocus){
	key.press("VOLUME_UP");
}

//降低音量
["Ctrl+F7"] = function(hFocus){
	key.press("VOLUME_DOWN");
}

//切换静音
["Ctrl+F8"] = function(){
	key.press("VOLUME_MUTE");
}

超级热键配置范例:依次按 ~date 输入大写的当前日期

["~date"] = function(hFocus){ 
	var zh = string.chineseNumber('〇一二三四五六七八九');
	key.sendString(zh.date()); //改为 zh.time() 输出大写的当前时间
}; 

注意超键热键中任何键名都只表示该键名所在的按键,不区分上档键。所以 ~ 键不需要同时按 Shift + ~ 。

超级热键配置范例:按大写自动切换到英文输入

["CAPSLK"]  = function(hFocus){  
	key.ime.setOpenStatus(false);
	key.ime.setConversionMode(0); 
	
	return true;
};

超级热键配置范例:右 Shift 键切换为英文

["RSHIFT"]  = function(hFocus){  
	key.ime.setOpenStatus(false);
	key.ime.setConversionMode(0); 
};

超级热键配置范例:左 SHIFT 键切换为中文

["LSHIFT"]  = function(hFocus){    
	var openState,mode = key.ime.state();
	if( openState && !key.ime.capital() ) return true; //当前已经是中文输入模式,不改变默认行为
	
	key.up("SHIFT");//先放开 SHIFT 键

	//如果是大写状态,切换为小写
	if(key.ime.capital())    key.press("CAPSLK") 

	//英文直接切中文 + 中文标点
	key.ime.setOpenStatus(true); //打开输入法
	key.ime.setConversionMode(1|0x400); //切换到中文状态,这一步不能省略
	
	//再次尝试用键盘切换中文标点,这一步不能省略
	key.combine("CTRL",".");
	
	//现在再次检测中文标点状态
	var openState,mode = key.ime.state();
	if(mode!=3/*_IME_SYMBOLMODE_SYMBOL*/){
		//说明切换到了英文标点,再切换回去
		key.combine("CTRL",".")
	}  
};

超级热键配置范例:按 Ctrl + . 切换到中文输入 + 中文标点 + 小写

["Ctrl+."]  = function(hFocus){    
	var openState,mode = key.ime.state();
	if( openState && !key.ime.capital() ) return true; //当前已经是中文输入模式,不改变默认行为
	
	key.up("Ctrl");//先放开 Ctrl 键

	//如果是大写状态,切换为小写
	if(key.ime.capital())    key.press("CAPSLK") 

	//英文直接切中文 + 中文标点
	key.ime.setOpenStatus(true); //打开输入法
	key.ime.setConversionMode(1|0x400); //切换到中文状态,这一步不能省略
	
	//再次尝试用键盘切换中文标点,这一步不能省略
	key.combine("CTRL",".");
	
	//现在再次检测中文标点状态
	var openState,mode = key.ime.state();
	if(mode!=3/*_IME_SYMBOLMODE_SYMBOL*/){
		//说明切换到了英文标点,再切换回去
		key.combine("CTRL",".")
	}  
};

超级热键配置范例:输入法纠错,已输出英文自动转为中文输入

["Ctrl+,"]  = function(hFocus){    
	var openState,mode = key.ime.state();
	if( openState && !key.ime.capital() ) return true; //当前已经是中文输入模式,不改变默认行为
	
	key.up("Ctrl");//先放开 Ctrl 键

	//如果是大写状态,切换为小写
	if(key.ime.capital())    key.press("CAPSLK") 

	//英文直接切中文 + 中文标点
	key.ime.setOpenStatus(true); //打开输入法
	key.ime.setConversionMode(1|0x400); //切换到中文状态,这一步不能省略
	
	//再次尝试用键盘切换中文标点,这一步不能省略
	key.combine("CTRL",".");
	
	//现在再次检测中文标点状态
	var openState,mode = key.ime.state();
	if(mode!=3/*_IME_SYMBOLMODE_SYMBOL*/){
		//说明切换到了英文标点,再切换回去
		key.combine("CTRL",".")
	}  
	
	//通过返回函数异步执行耗时操作(避免系统删除热键钩子)
	return function(){ 
		key.combine("SHIFT","HOME");//选中当前行 
		key.combine("CTRL","C");//复制当前行
		
		var line = win.clip.read(); //读取剪贴板文本
		var str = string.match(line,"[a-zA-Z]+#34;); //查找尾部连续字母
		key.press("RIGHT");//按右方向键,取消选区
		
		//如果字符串非空
		if(#str){ 
			key.repeat("BACK",#str);//按退格键指定次数(取字符串长度)
			key.send(str);//字符串转换为发送按键
			//key.press("SPACE");//发果需要按空格,请取消前面的注释符号
		}
	};  
};

超级热键配置范例:粘贴时替换指定的字符

["Ctrl+V"] = function(){
	var str = win.clip.read();
	 
	if(str && string.find(str,"abcd")){
		str = string.replace(str,"abcd","");
		win.clip.write(str);  
	}
	
	return true; //执行默认操作 
}

超级热键配置范例:引号配对

[`SHIFT+"`] = function(hFocus){  
	
	if( checkImeProcess(hFocus,"Code.exe") ){
		return true;//允许继续发送按键
	}

	var o,s = key.ime.state();
	key.sendString(s==3 ? `“”` : `""`); 

	//与目标窗口共享输入状态
	winex.attach(hFocus,true);
	
	//设置LSHIFT,RSHIFT 为弹起状态
	key.up("RSHIFT","LSHIFT","SHIFT");
	key.setState(false,"RSHIFT","LSHIFT","SHIFT"); 

	//移动光标
	key.press("LEFT");
	
	//取消共享输入状态
	winex.attach(hFocus,false);
}

超级热键配置范例:微软五笔打开或关闭拼音混输

["Ctrl+,"] = function(hFocus){  
	import win.reg;
	var reg = win.reg("HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS");
	var mode = !reg.queryValue("PinyinMixEnable") ? 1 : 0
	reg.setDwValue("PinyinMixEnable",mode)	
	
	key.ime.changeRequest(0x4090409)
	key.ime.changeRequest(0x8040804)
};

超级热键配置范例:切换鼠标左右键

["Ctrl+SHIFT+RIGHT"] = function(hFocus){  
	::User32.SwapMouseButton(!::User32.GetSystemMetrics(23));
}

超级热键配置范例:微软五笔叠字键

["`"]  = function(hFocus){  
	var openState,mode = key.ime.state();//用法请查看 aardio 文档
	if(!openState 
			||  mode !=3 || key.getState("Shift")  
			|| key.getState("Ctrl")  
			|| key.getState("CAPSLK")  ) {
			return true; //允许此按键继续发送
	}
	
	key.combine("SHIFT","LEFT"); //向后选一个字
	key.combine("CTRL","C"); //复制
	key.press("RIGHT"); //取消选中
	key.combine("CTRL","V"); //粘贴
};

实现更多功能 ……

ImTip 体积虽然小,但已自带了大量 #aardio# 库。您也可以下载 aardio ,将 aardio 目录下的 /lib/ 目录复制到 ImTip.exe 所在目录 —— 超级热键就可以使用全部的 aardio 库了。

也可以在 /lib/ 目录下新建用户库,然后通过 import 语句导入超级热键。

超级热键配置本质是一个表对象 (table),不但可以包含键值对,也可以包含数组成员。利用这个特性可在超级热键配置内直接执行代码。例如添加一个检测当前窗口启动程序名的全局函数 checkImeProcess,然后使用该函数检测目标窗口的启动程序文件名:

(function(){
	var lastFocus,lastPath,lastClass;
	checkImeProcess = function(hFocus,exeFile){
		if(lastFocus != hFocus){
			lastClass = win.getClass(hFocus);
			var tid,pid = win.getThreadProcessId(hFocus);
			lastPath = process.getPath(pid);
			lastFocus = hFocus
		}
	
		return (lastPath && io.splitpath(lastPath).file == exeFile )
	}	
})();

//引号配对
[`SHIFT+"`] = function(hFocus){  
	
	if( checkImeProcess(hFocus,"Code.exe") ){
		return true;//允许继续发送按键
	}

	var o,s = key.ime.state();
	key.sendString(s==3 ? `“”` : `""`); 

	//与目标窗口共享输入状态
	winex.attach(hFocus,true);
	
	//设置LSHIFT,RSHIFT 为弹起状态
	key.up("RSHIFT","LSHIFT","SHIFT");
	key.setState(false,"RSHIFT","LSHIFT","SHIFT"); 

	//移动光标
	key.press("LEFT");
	
	//取消共享输入状态
	winex.attach(hFocus,false);
}

比较常用的按键、文本输入函数:

//发送字符串
key.sendString("这里是要发送的字符串")

//发送按键
key.send("/")

//发送按键
key.press("ENTER")

//判断中文输入法是否打开,打开则执行花括号中的语句
if( key.ime.state() ){ }

更多库函数用法请参考 aardio 自带的《库函数文档》,或者 aardio 自带的范例:

aardio 也支持很多第三方编程语言,例如 C语言、C++、C#、Java、Python、R、Javascript、Node.Js、Fortran、VB、PHP、VBScript、PowerShell、NewLISP、AutoLISP、Delphi、FreeBASIC、Ruby、Rust、Julia、Nim、Go 语言、批处理 ...... 用法请参考 aardio 自带范例。

如果您对超级热键还有任何疑问,欢迎在评论区留言,我会尽快解答。

相关推荐

机器学习分类模型评估(三)-F值(F-Measure)、AUC、P-R曲线

概述上二篇文章分别讲述了准确率(accuracy)、精确率(Precision)、查准类、召回率(Recall)、查全率、ROC曲线,本文讲述机器学习分类模型评估中的F值(F-Measure)、AUC...

SPSS ROC曲线诊断临界值确定

ROC曲线是在临床医学和流行病学研究中一种常用的在诊断试验、预测模型中用于决定最佳临界点的方法。ROC曲线用真阳性率和假阳性率作图得出曲线,其横轴表示假阳性率(1-特异度),纵轴表示真阳性率(灵敏度)...

分类器模型检测--ROC曲线和AUC值

在监督学习建模中有一个重要的模块是模块的检测,就是怎样判断一个模型的好坏?那么常用的的检测的指标有P值、R值、F值、ROC曲线、AUC值等,今天来学习他们都是怎么来的,有什么用处。这里为二分类问题,即...

【Python机器学习系列】建立梯度提升模型预测心脏疾病

这是Python机器学习系列原创文章,我的第204篇原创文章。一、引言对于表格数据,一套完整的机器学习建模流程如下:针对不同的数据集,有些步骤不适用即不需要做,其中橘红色框为必要步骤,由于数据质量较高...

如何Keras自动编码器给极端罕见事件分类

全文共7940字,预计学习时长30分钟或更长本文将以一家造纸厂的生产为例,介绍如何使用自动编码器构建罕见事件分类器。现实生活中罕见事件的数据集:背景1.什么是极端罕见事件?在罕见事件问题中,数据集是...

机器学习分类问题:9个常用的评估指标总结

对机器学习的评估度量是机器学习核心部分,本文总结分类问题常用的metrics分类问题评估指标在这里,将讨论可用于评估分类问题预测的各种性能指标1ConfusionMatrix这是衡量分类问题性能的...

基于R语言的ROC曲线绘制及最佳阈值点(Cutoff)选择

ROC曲线在介绍ROC曲线之前,我们首先需要介绍混淆矩阵(ConfusionMatrix)。在统计分类模型的评估过程中分别统计分类模型归错类,归对类的观测值个数,然后把结果放在一个表里展示出来的表格...

R数据分析:多分类问题预测模型的ROC做法及解释

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评...

SPSS实战:多个指标ROC曲线方向不一致的解决办法汇总(收藏)

在诊断实验和预测模型的临床效能评价中,我们常常用到ROC曲线分析。在SPSS中绘制ROC曲线操作比较简单,但如果将多个指标的ROC曲线绘制在同一个图中,有时候会碰到有些指标的ROC曲线在对角线上面,一...

小果教你快速分析ROC生存曲线图

尔云间一个专门做科研的团队原创小果生信果小伙伴们,大家好呀,很高兴和大家见面,前段时间应小伙伴出的解读ROC曲线图,小伙伴反应很是积极,这不最近小伙伴对于不同年份的ROC曲线图的分析呼声很高,...

生信文章中高频出现、模型评估必备分析——ROC曲线图,怎么看?

尔云间一个专门做科研的团队关注我们做了生信分析,拿到一堆数据,看不懂图怎么办?火山图、热图、散点图、箱线图、瀑布图···这么多类型的图都咋看?风险模型预后评估图、GO-KEGG富集分析图、GSEA...

如何看懂文献里那些图——ROC曲线图

ROC曲线的基本思想是把敏感度和特异性看作一个连续变化的过程,用一条曲线描述诊断系统的性能,其制作原理是在连续变量中不同界值点处计算相对应的灵敏度和特异度,然后以敏感度为纵坐标、1-特异性为横坐标绘制...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

准确性检验 (ROC曲线)的SPSS操作教程及结果解读

作者/风仕在上一期,我们已经讲完了诊断试验的基础知识,这期开始讲准确性检验(ROC曲线),我们主要从准确性检验(ROC曲线)的介绍、基本概念、绘制原理、统计量、使用条件及案例的SPSS操作演示这几...

SPSS:ROC 曲线为什么反了?

【作者介绍】李志辉,长期从事各类统计软件应用研究,主编或参编SPSS、MINITAB、STATISTICA多个统计软件教材共8本。代表作:电子工业出版社《SPSS常用统计分析教程(SPSS22.0中...