超級熱鍵可通過簡單編程 —— 自動化完成復雜操作,提升效率,
? 快速上手
本教程需要一個很小的開源軟體 ImTip ( 體積 639 KB ),

請右鍵點開 ImTip 托盤選單,然后點擊「管理超級熱鍵」:
然后將熱鍵配置改為如下代碼,并且勾選「啟用超級熱鍵」,再點擊「保存」按鈕使熱鍵生效,
//大寫金額、日期、時間 ["Ctrl+$"] = function(hFocus){ win.dlg.chineseNumber().show(); }; //打開調色器 ["Ctrl+#"] = function(hFocus){ //創建選色器 var dlg = win.ui.ctrl.pick(); dlg.show(); //置頂 win.setTopmost(dlg.hwnd,true); };
上面的配置定義了 "Ctrl+$","Ctrl+#" 這兩個熱鍵,中括號里是按鍵名字串,等號的后面指定要輸入的文本或者需要執行的函式物件,
以上熱鍵配置將自動轉換為以下 aardio 代碼,然后編譯執行:
//匯入超級熱鍵 import key.hotkey; //創建超級熱鍵 var superHotkey = key.hotkey(winform); //批量加載熱鍵配置表 superHotkey.loadTable({ ["Ctrl+$"] = 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]+$"); //查找尾部連續字母 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"); //粘貼 };
? 超級熱鍵配置范例:自動發送 QQ 聊天訊息
(function(){ import web.form; //創建呼叫 QQ 的瀏覽器控制元件 var wb = web.form(win.form()); //添加打開指定 QQ 的函式 openQq = function(qq,txt){ wb.go("tencent://message/?uin="+qq); } })(); /* 熱鍵:打開指定QQ */ ["Ctrl+Q"] = function(hFocus){ return function(){ openQq("改為QQ號碼") } };
? 實作更多功能 ……
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 自帶范例,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/508878.html
標籤:Windows
上一篇:個人學習-Linux檔案系統架構
下一篇:超級熱鍵大全
