超級熱鍵可通過簡單編程 —— 自動化完成複雜操作,提升效率。 ▶ 快速上手 本教程需要一個很小的開源軟體 ImTip ( 體積 639 KB ), 請右鍵點開 ImTip 托盤菜單,然後點擊「管理超級熱鍵」: 然後將熱鍵配置改為如下代碼,並且勾選「啟用超級熱鍵」,再點擊「保存」按鈕使熱鍵生效。 // ...
超級熱鍵可通過簡單編程 —— 自動化完成複雜操作,提升效率。
▶ 快速上手
本教程需要一個很小的開源軟體 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 自帶範例。