AHK-UMSS框架 (AHK通用修饰键解决方案,任何键都是修饰键)
生活随笔
收集整理的這篇文章主要介紹了
AHK-UMSS框架 (AHK通用修饰键解决方案,任何键都是修饰键)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵)
?
?
?
?
1 #Warn 2 #NoEnv ; # 禁用環(huán)境變量檢查:不檢查空變量是否為"環(huán)境變量",可以極大地提高效率 3 #Hotstring EndChars ◎ ; # 熱字串終止符號(hào)設(shè)置:只把空格作為終止符,(文檔上所說(shuō)是不能單獨(dú)用空格的,最多是空格之外再加一個(gè),所以用◎充數(shù)) 4 #Hotstring ? O Z 5 ;~ #SingleInstance force ;# 強(qiáng)制重啟:啟動(dòng)時(shí)如果舊腳本已經(jīng)運(yùn)行,不彈出提示,直接關(guān)閉舊的之后運(yùn)行,主要是便于程序的調(diào)試和更改 6 ;~ SetStoreCapsLockMode, Off 7 SetTitleMatchMode 2 ;# Title匹配模式:Title只需要包含即可匹配 8 9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10 ; 腳本名稱:AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵) 11 ; 中英文結(jié)合:AHK-UMSS (AHK通用修飾鍵解決方案 AutoHotKeyUniversalModifierSymbolsSolution) 12 ; 腳本版本號(hào) v3.0.1 beat 13 ; AHK版本: 1.1.30 14 ; 語(yǔ)言:中文 15 ; 作者:心如止水<QQ:2531574300> <Autohotkey高手群(348016704)> 16 /* 17 # 腳本功能: 可以在Tab本身功能完全不受影響的前提下(包括長(zhǎng)按和短按)讓其作為修飾鍵,支持各種參數(shù)的自定義,能力比v1.x版本上了一個(gè)臺(tái)階。 18 ## 提示:只是框架解決方案,里面沒(méi)有設(shè)置依托Tab設(shè)置大量熱鍵,你需要根據(jù)自己的情況設(shè)置,另外Tab應(yīng)該也可以改為任何的"非修飾鍵",比如"分號(hào)"等等等。潛力無(wú)限,等你挖掘。 19 # 衍生版本: 暫無(wú) 20 # 下一步的思路:1,支持更多自定義 2,更模塊化面向?qū)ο?3,繼續(xù)優(yōu)化注釋做到簡(jiǎn)明扼要 4,添加功能更方便(用一句函數(shù)可以完成,只需要輸入按鍵和功能延續(xù)片段,長(zhǎng)的#Include) 21 # 已知問(wèn)題:1,在長(zhǎng)時(shí)間發(fā)送大寫修飾符的時(shí)候,會(huì)隔10個(gè)左右的字符發(fā)送一次小寫字符,但是這個(gè)問(wèn)題幾乎沒(méi)影響使用,這個(gè)場(chǎng)景太小眾,看了一下沒(méi)找出原因,不打算修復(fù),拉長(zhǎng)TabndemSpeed會(huì)改善,應(yīng)該是AHK的反應(yīng)太慢導(dǎo)致的吧。 22 # 主力更新地址1(智能熱鍵論壇) https://www.autoahk.com/archives/12126 23 (格式為 https://www.autoahk.com/archives/[0-9]{6}) 24 # 主力更新地址2(博客園隨筆) https://www.cnblogs.com/xrvu/p/9787884.html 25 (格式為 https://www.cnblogs.com/xrvu/p/[0-9]{7}.html) 26 */ 27 ; ^_^: 如果您有什么新的想法和改進(jìn)的建議,或者是發(fā)現(xiàn)了BUG,歡迎加我的QQ,一起探討改進(jìn) :^_^ 28 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 29 ;~ 測(cè)試區(qū)域 30 31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 32 /* 33 版本信息: 34 v1.0.2:增補(bǔ)了注釋,Tab單擊改為默認(rèn)關(guān)閉 35 v1.0.3:在名字中加入AHK(AutoHotKey)便于搜索引擎的爬取 36 v1.1.0:1,添加注釋(改造潛力/派生方案) 2,增加注釋"主更新"地址 37 v1.1.1 注釋:剛剛才發(fā)現(xiàn),如果要實(shí)現(xiàn)這個(gè)思路,必須使用熱鍵自帶的方法,不能使用send的方法,謝謝cobocy的指教,如果您知道幫助文件在哪個(gè)地方講過(guò)這件事情,歡迎您能夠告訴我,我還沒(méi)找到。 38 v1.1.5 1,緊急修復(fù)BUG,level3沒(méi)有加return,會(huì)導(dǎo)致出現(xiàn)誤觸發(fā),已修復(fù),感謝@長(zhǎng)島的雪 的報(bào)告 2,增加了"關(guān)于響應(yīng)速度的說(shuō)明"等注釋 39 v2.0beat:這個(gè)版本的機(jī)制和之前的版本是完全不同的,所以兩條線更新,類似AHKL和AHK2,有關(guān)系,但是區(qū)別很大。 40 v2.0.1beat:1,修復(fù)MsgBox %LongPressLoop%測(cè)試語(yǔ)句忘記注釋的BUG 2,解決了開(kāi)頭的腳本信息錯(cuò)誤的問(wèn)題,增加了一些內(nèi)容 41 v2.0.2beta :改為更容易被檢索和理解的名字,AHK-UMSS (AHK通用修飾符解決方案 AutoHotKeyUniversalModifierSymbolsSolution) 42 v2.0.3beta :增加了最后的"尾巴:偉大的征途 - 這個(gè)腳本的來(lái)龍去脈"的注釋 43 v2.0.4beta :實(shí)現(xiàn)了按鍵變量的自定義 44 v2.0.5beta :1,支持舊版Tab++1.x的熱鍵方式(其實(shí)更適合大多數(shù)人的情況,默認(rèn)就是用這個(gè)) 2,支持一鍵修改熱鍵 45 v2.1.0 :1,"熱鍵白名單" 注釋增補(bǔ) 2,新增3模式,表示采用禁用單擊發(fā)送修飾鍵的OldKey模式 3,Old等待時(shí)間單獨(dú)用一個(gè)變量來(lái)表示 4,增加快速為當(dāng)前修飾鍵添加連發(fā)熱鍵的方法 5,加入"設(shè)置保存并重啟當(dāng)前腳本的熱字串" 6,"跳板熱鍵(中轉(zhuǎn)鍵)可更改" 7.感謝"沉默不語(yǔ)"的BUG反饋 46 v2.1.1 :解決一個(gè)會(huì)導(dǎo)致程序失效的嚴(yán)重問(wèn)題 47 v2.1.2 :1,修復(fù)CapsLock開(kāi)啟時(shí),無(wú)法正常發(fā)送大寫字母的問(wèn)題,感謝 @丶行者先生、 的反饋 2,改TabndemSpeed=25 為 TabndemSpeed=35 48 v2.1.3 :1,使用函數(shù)ST()設(shè)置觸發(fā)器,讓程序可復(fù)用性更好 2,加了一些注釋 49 v2.5 beat :1,修復(fù)了CapsLock等3個(gè)可切換鍵,無(wú)法切換的問(wèn)題,感謝 @丶行者先生、 的反饋 2,默認(rèn)send模式改為2 50 v2.61 beat :1,增加了send模式2+,并且改為默認(rèn) 2,為了程序的簡(jiǎn)潔和可讀性,不再采用"一鍵默認(rèn)設(shè)置" 3,優(yōu)化了send模式選擇錯(cuò)誤提示框顯示的方式 51 v3.0 beat :新增了一種功能添加方法(新的被叫做方法1,之前的被叫做方法2),該方法非常靈活,支持通過(guò)語(yǔ)境約束定義熱鍵(可以實(shí)現(xiàn)三按鍵) 52 v3.01 beat :1,注釋掉一處不該有的MsgBox(調(diào)試時(shí)剩下的) 2,注釋繼續(xù)優(yōu)化 3,自動(dòng)執(zhí)行段上方微調(diào) 53 */ 54 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 55 56 ;# 定義:制表符xx指的就是發(fā)送{Tab},功能xx指的就是以Tab為組合鍵執(zhí)行的任務(wù),比如F20 & j。 57 58 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 59 /* 60 # 關(guān)于響應(yīng)速度的說(shuō)明 61 ## 長(zhǎng)按必定導(dǎo)致單擊速度變慢:例如用戶按下一個(gè)鍵會(huì)停留50毫秒左右,如果該鍵沒(méi)有長(zhǎng)按功能,那么只要檢測(cè)到用戶按下這個(gè)鍵, 在其手指沒(méi)有離開(kāi)的時(shí)候,可能幾毫秒的時(shí)間之內(nèi)這個(gè)鍵的功能就已經(jīng)被激發(fā)了;但是如果這個(gè)鍵設(shè)置了長(zhǎng)按功能,那么只要用戶的手指沒(méi)有離開(kāi),系統(tǒng)就無(wú)法分辨到底是長(zhǎng)按還是短按,命令就不能發(fā)送,直到用戶的手指離開(kāi)或者時(shí)間已到才可以采取相應(yīng)的動(dòng)作,人短按的時(shí)候肯定是不如機(jī)器快的,那么"只要按鍵開(kāi)啟了長(zhǎng)按,短按的效率必定下降"。 62 63 # UMSS針對(duì)該問(wèn)題的方法: 64 ## 廣泛的自定義:既然速度降低,是不可避免的,那么就應(yīng)該有一個(gè)可以完全自定義的方案,UMSS就是如此。你可以選擇好幾種模式。 65 66 ## 四種模式供你選擇 九個(gè)參數(shù)均可自定義 兩種不同的功能添加方法 67 68 ### 模式1 修飾鍵功能保全方案:修飾鍵的完整功能被保留。在這個(gè)模式下修飾鍵是可以發(fā)送自己的,比如修飾鍵為Tab,那么 無(wú)論是短按還是長(zhǎng)按都是可以正常發(fā)送Tab的,長(zhǎng)按的,連發(fā)效果也保留。這個(gè)模式下的諸多參數(shù),你可以自定義,以便調(diào)整到一個(gè)最適合你的(默認(rèn)方案應(yīng)該適合大多數(shù)人,所以說(shuō)如果不是遇到問(wèn)題,那就先不用調(diào)) 69 ### 模式2 可單擊修飾鍵方案:在方案二的基礎(chǔ)上,如果快速的單擊的話,是可以發(fā)送修飾鍵本身的。(但是有一定時(shí)間限制,長(zhǎng)按時(shí)間超過(guò)大約1秒就不會(huì)再發(fā)送) 70 ### 模式2+ 可單擊修飾鍵方案Plus:在方案二的基礎(chǔ)上可以自定義"等待時(shí)間"(Timeout2),從 1s到無(wú)窮 可以自定義 71 ### 模式3 完全修飾鍵方案:這個(gè)很好理解,也就是修飾鍵無(wú)法發(fā)送自己(大多修飾鍵都如此)。不過(guò)如果在此模式下你要用修飾鍵本身,方案就是啟用組合熱鍵來(lái)替代發(fā)送功能(包括連發(fā)也可以一并解決),程序內(nèi)置了OtherTabndemKey,你可以通過(guò)修此參數(shù)一鍵設(shè)置。 72 73 ## 心如止水的方案:我個(gè)人的方案就是讓Tab安安靜靜的做他的修飾鍵,我把send{Tab}的功能外包給了CapsLock+Space,主要是和我的語(yǔ)音識(shí)別鍵是離得很近的,在我的思維導(dǎo)圖軟件iThoughts用起來(lái)很爽,所以就習(xí)慣了。 74 ## 特別提示:主要的作用是把非修飾鍵當(dāng)做修飾鍵來(lái)用,所以:1,已經(jīng)是修飾鍵的例如(Ctrl)不能用 2,一定有延遲,所以對(duì)延遲敏感的場(chǎng)景不能用(比如字母,會(huì)影響打字速度) 75 76 77 */ 78 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 79 80 ;# 聲明全局變量 81 global LongPressWT,TandemWT,TabndemSpeed,Timeout,OP,TA,keys,LongPressLoop,OldTimeout,OtherTabndemKey,FF,Timeout2 82 83 ;--------------------------------------------------------------------------------------------------------------- 84 85 86 ;# 設(shè)置詳細(xì)說(shuō)明 87 88 ;# 全局生效設(shè)置 89 ;## 被修改為修飾鍵的鍵 Keys(String) :無(wú)需多解釋,默認(rèn)是Tab。如果使用分號(hào)等,不要忘記轉(zhuǎn)義。 90 ;## 替代連發(fā)按鍵 OtherTabndemKey(String) :可以設(shè)置一個(gè)熱鍵(與當(dāng)前修飾鍵),來(lái)專門連發(fā)當(dāng)前修飾鍵,以彌補(bǔ)Tab1.x中按鍵無(wú)法連發(fā)的問(wèn)題(默認(rèn)不開(kāi)啟留空,如果想開(kāi)啟,填入對(duì)應(yīng)按鍵就可以,比如global OtherTabndemKey:="u") 91 ;## (已經(jīng)棄用)是否強(qiáng)制使用默認(rèn)參數(shù) OP(0|1):0的意思是關(guān)閉,1是打開(kāi) 92 ;## 中轉(zhuǎn)鍵 FF(String):中轉(zhuǎn)熱鍵是為更好的實(shí)現(xiàn)程序迫不得已的選擇,好在系統(tǒng)內(nèi)置了F13-F24,平常根本就用不到,所以剛好拿來(lái)做中轉(zhuǎn)。提供更改中轉(zhuǎn)鍵的選項(xiàng),是因?yàn)楹芏嘤脩艨赡軙?huì)同時(shí)使用多個(gè)修飾鍵,如果不重新定義,那就會(huì)沖突。 93 94 ;# 在"模式1 功能保全方案"中起效的設(shè)置 95 ;## 長(zhǎng)按等待組合鍵觸發(fā)時(shí)間 LongPressWT(ms):在模式1中,系統(tǒng)會(huì)等待您一段時(shí)間,在這個(gè)時(shí)間段內(nèi),如果按下組合鍵則觸發(fā)功能,否則就不觸發(fā)功能,而是發(fā)送修飾符本身。該項(xiàng)就是設(shè)置此時(shí)間段的。 96 ;## 修飾符連發(fā)等待時(shí)間 TandemWT(ms):在模式1中,如果已經(jīng)超過(guò)了等待時(shí)間,程序會(huì)進(jìn)入發(fā)送本身模式,但是在連續(xù)發(fā)送之前會(huì)有一段時(shí)間的停頓(Windows正常的連發(fā)就是如此)。該項(xiàng)就是設(shè)置該停頓的。 97 ;## 修飾符連發(fā)速度 TandemSpeed(ms):在模式1中,進(jìn)入了實(shí)質(zhì)性的連發(fā)階段,雖然叫做連發(fā),其實(shí)還是有一小段的間隔的,發(fā)送的快了,不好掌握(Windows正常的連發(fā)就是如此)。該項(xiàng)就是設(shè)置該小段間隔的。 98 ;## 功能連發(fā)超時(shí) Timeout(s):特別提示的是,TimeOut的單位和別的不一樣,不是毫秒而是 秒。在模式1中,進(jìn)入了功能的連發(fā)階段,連續(xù)發(fā)送很長(zhǎng)的一段時(shí)間之后,為了防止出現(xiàn)BUG,連發(fā)會(huì)停止(因?yàn)橐话闳艘灿貌坏竭B發(fā)五秒,基本上半屏幕符號(hào)了)。該項(xiàng)就是設(shè)置功能連發(fā)上限時(shí)間的。 99 100 ;# 在"模式2 可單擊修飾鍵方案"以及"模式3 完全修飾鍵方案"中起效的設(shè)置 101 ;## Old版本按下等待時(shí)間 OldTimeout(s):在Old模式下,和windows本身的不同,修飾鍵按下是有等待時(shí)間的(比如按下5秒內(nèi)可以觸發(fā))。該項(xiàng)就是設(shè)置該等待時(shí)間的。 102 103 ;# 在"模式2+"的設(shè)置 104 ;## Timeout2(S),在Timeout2內(nèi),長(zhǎng)按keys,只要功能沒(méi)有觸發(fā),松開(kāi)后都會(huì)發(fā)送keys本身。默認(rèn)是無(wú)窮,也就是-1,可以重新自己設(shè)置(最少1s)。 105 ;--------------------------------------------------------------------------------------------------------------- 106 107 ;# 添加新的功能 108 ;# 這只是一個(gè)框架,所以里面基本上沒(méi)裝什么功能,就只是裝了一個(gè)按下jk分別左右移動(dòng)的功能。 109 ;# 裝功能的話你搜一下"<<<<<<<<<<<<功能添加區(qū)>>>>>>>>>>>>"就行了 110 111 ;# 強(qiáng)制使用默認(rèn)模式:1表示強(qiáng)制使用默認(rèn)參數(shù),0表示采用自定義參數(shù) 112 ;## 為了程序的可讀性,該設(shè)置取消 113 ;~ global UseDefault:=0 114 115 ;--------------------------------------------------------------------------------------------------------------- 116 117 ;# 不可自定義參數(shù) 118 119 ;# TA是功能被觸發(fā)計(jì)數(shù)器,1表示有Tab功能已經(jīng)被觸發(fā),0表示并沒(méi)有,所以每個(gè)功能都要以TA=1結(jié)尾,告訴程序功能已經(jīng)觸發(fā)了。 120 121 122 global TA:=0 123 ;# 通過(guò)用戶輸入的長(zhǎng)按等待時(shí)間計(jì)算檢測(cè)循環(huán)次數(shù) 124 ;~ global LongPressLoop :=Ceil(500/50) 125 ;改為10,提高靈敏度 126 global LongPressLoop :=Ceil(500/10) 127 128 ;--------------------------------------------------------------------------------------------------------------- 129 130 131 ;# 可自定義參數(shù) 132 133 ;## 全局設(shè)置 134 135 ;### 請(qǐng)選擇模式 模式1-修飾鍵功能保全方案 模式2-可單擊修飾鍵方案 模式2+ 可單擊修飾鍵方案Plus 模式3-完全修飾鍵方案 136 global MySendMode:="2+" 137 138 ;### 選擇要變成修飾鍵的按鍵 139 global keys:="Tab" 140 141 ;### 一鍵設(shè)置替代組合鍵(默認(rèn)關(guān)閉) 142 global OtherTabndemKey:="" 143 144 ;### 設(shè)置"中轉(zhuǎn)鍵" 145 global FF:="F20" 146 147 ;### 設(shè)置連發(fā)時(shí)間上限 148 Timeout=5 ;單位是s 149 150 ;## 為模式1設(shè)置參數(shù) 151 152 LongPressWT=500 ;### 判斷為長(zhǎng)按的時(shí)間 153 TandemWT=180 ;### 進(jìn)入發(fā)送模式后,第一個(gè)發(fā)送與連發(fā)的間隔 154 TabndemSpeed=35 ;### 進(jìn)入連發(fā)模式后,連發(fā)之間的間隔 155 156 ;## 為模式2&3設(shè)置參數(shù) 157 158 ;### 功能組合鍵等待時(shí)間(過(guò)了等待時(shí)間不會(huì)響應(yīng)功能組合鍵) 159 OldTimeout=5 ;單位是s 160 161 ;## 為模式2+設(shè)置參數(shù) 162 163 ;### 按鍵等待時(shí)間(過(guò)了等待時(shí)間,松手也不會(huì)發(fā)送按鍵本身,也不會(huì)響應(yīng)功能,-1代表無(wú)限) 164 Timeout2=-1 ;單位是s,-1代表無(wú)限(實(shí)際上<=0都代表無(wú)限) 165 166 ;--------------------------------------------------------------------------------------------------------------- 167 168 169 170 ;通過(guò)HotKey的方式定義熱鍵(便于直接使用變量修改) 171 172 if(MySendMode==1) 173 { 174 Hotkey,%Keys%,MyKey,I2 175 } 176 else if(MySendMode==2) 177 { 178 Hotkey,%Keys%,OldMyKey,I2 179 180 ;# 這里是 mode2 中注冊(cè) 單擊映射 的地方 181 Hotkey,%FF%,EnableClick,I0 182 } 183 else if(MySendMode=="2+") 184 { 185 Hotkey,%Keys%,MyKey2_Plus,I2 186 } 187 else if(MySendMode==3) 188 { 189 Hotkey,%Keys%,OldMyKey,I2 190 } 191 else 192 { 193 MsgBox,16,模式選擇出現(xiàn)錯(cuò)誤,錯(cuò)誤的 MySendMode 值是 "%MySendMode%" 194 } 195 196 197 ;--------------------------------------------------------------------------------------------------------------- 198 199 ;# 拼接Timeout2 200 if (Timeout2>0) 201 Timeout2:="T" . Timeout2 202 else 203 Timeout2:=-1 204 205 ;--------------------------------------------------------------------------------------------------------------- 206 207 208 209 ;如果不為空就注冊(cè)熱鍵,用于修飾鍵自身的連發(fā) 210 if !(OtherTabndemKey=""){ 211 212 Hotkey,%keys% & %OtherTabndemKey%,OtherTabndem,I0 213 } 214 215 ; # 注冊(cè)主功能熱鍵(請(qǐng)放在最后,因?yàn)闀?huì)干擾自動(dòng)執(zhí)行段) 216 domain() 217 218 ; # 自動(dòng)執(zhí)行段結(jié)束 219 return 220 221 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 222 223 ;# 熱鍵白名單(如果使用此腳本之后,系統(tǒng)或其它應(yīng)用的相關(guān)熱鍵出現(xiàn)問(wèn)題無(wú)法使用,可以把熱鍵添加到這個(gè)名單中。新版本已經(jīng)基本修復(fù)了這個(gè)問(wèn)題,但是還留著以防后患吧。) 224 225 #inputlevel,3 226 227 ;## 在這個(gè)層級(jí)是不覆蓋系統(tǒng)默認(rèn)鍵的,可以設(shè)置系統(tǒng)默認(rèn)鍵的白名單 228 ;~的意思是不覆蓋系統(tǒng)本身的快捷鍵 229 230 ;### 為了能讓系統(tǒng)的窗口切換可以正常運(yùn)行,以Level3的速度發(fā)送這些按鍵,避免受到干擾 231 ;位置0 232 ;# 注意 每個(gè)系統(tǒng)熱鍵下面,必須加return 233 /* 234 235 ~!Tab:: 236 return 237 ~#Tab:: 238 */ 239 return 240 241 242 #inputlevel 243 244 245 ;--------------------------------------------------------------------------------------------------------------- 246 247 248 ;<<<<<<<<<<<<功能添加方法1:示例功能區(qū)(推薦)>>>>>>>>>>>> Start 249 #If GetKeyState(keys,"p") ;## 語(yǔ)境約束:意思是當(dāng)keys被實(shí)際按下時(shí),一下內(nèi)容就生效 250 251 252 q:: 253 ST() ;## 這個(gè)函數(shù)的意思是告訴程序已經(jīng)觸發(fā)功能,所以不需要再等,send模式1和send模式2+用得到,send模式2-3用不到 254 MsgBox,成功觸發(fā) `n %keys%+q 熱鍵 255 return 256 257 ;## 方法1的優(yōu)勢(shì):方法1 很靈活,可以搭配系統(tǒng)中其他的修飾鍵,做到定義3快捷鍵 ,而且你也可以使用語(yǔ)境約束來(lái)適配更多情景,比如當(dāng)Word存在時(shí)(下面有例子)。 258 !q:: 259 ST() 260 MsgBox,成功觸發(fā) `n Alt+%keys%+q 熱鍵 261 return 262 263 ;## 兩種方法的優(yōu)先級(jí):當(dāng)方法1和方法2沖突時(shí),方法2優(yōu)先,在這里Keys+k代表向右移動(dòng)2次,在模式2中是1次,只有注釋方法2中的內(nèi)容,才能移動(dòng)2次。 264 k:: 265 ST() 266 send,{right 2} 267 return 268 return 269 270 #If ;## 語(yǔ)境約束結(jié)束 271 272 273 ;--------------------------------------------------------------------------------------------------------------- 274 275 #If GetKeyState(keys,"p") AND WinExist("ahk_exe WINWORD.EXE") ;## 語(yǔ)境約束:意思是當(dāng)keys被實(shí)際按下并且Word.exe窗口存在時(shí),生效 276 277 !w:: 278 ST() 279 MsgBox,成功觸發(fā) `n Alt+%keys%+w 熱鍵 280 return 281 282 #If ;## 語(yǔ)境約束結(jié)束 283 284 285 ;<<<<<<<<<<<<功能添加方法1:示例功能區(qū)(推薦)>>>>>>>>>>>> End 286 287 288 289 ;--------------------------------------------------------------------------------------------------------------- 290 291 292 293 ;<<<<<<<<<<<<功能添加方法2:功能添加區(qū)>>>>>>>>>>>> Start 294 domain(){ 295 global LongPressWT,TandemWT,TabndemSpeed,Timeout,OP,TA,keys,LongPressLoop,OtherTabndemKey,FF 296 297 ;# 注冊(cè)熱鍵等等被激發(fā) 298 Hotkey,%FF% & j,Kj,I0 ;這是注冊(cè)熱鍵的意思,%FF% & j中的"%FF%"就是你填的中轉(zhuǎn)鍵,這個(gè)不用動(dòng),默認(rèn)是F20,& 就是并且的意思,%FF% & j就是"當(dāng)你的修飾鍵和j鍵同時(shí)按下時(shí)",kj是函數(shù)名,是要執(zhí)行的功能,在下方的功能區(qū)可以自己填。I0,指的是接收等級(jí)inputlevel,具體的意思可以看幫助文件,大多數(shù)時(shí)候根本用不到,也不用去碰。 299 Hotkey,%FF% & k,Kk,I0 300 return 301 302 } 303 304 305 Kj(){ ;這個(gè)地方是函數(shù)名,命名規(guī)則是字符k+按鍵名,比如用修飾鍵配合j觸發(fā)的,就叫做Kj,這不是硬性規(guī)定,只不過(guò)我覺(jué)得這樣的話可讀性會(huì)好。 306 ST() ;這個(gè)函數(shù)的意思是告訴程序已經(jīng)觸發(fā)功能,所以不需要再等,模式1和模式2+用得到,模式2-3用不到 307 308 send,{Left} ;然后這個(gè)地方就可以增加語(yǔ)句了,就是你的功能,這里是發(fā)送"向左",怎么做隨你。如果功能代碼量大,為了可讀性建議使用#Include導(dǎo)入。 309 return ;不要忘記加return 310 } 311 312 313 Kk(){ 314 ST() 315 send,{right} 316 return 317 } 318 319 ;<<<<<<<<<<<<功能添加方法2:示例功能區(qū)>>>>>>>>>>>> End 320 321 322 323 ;--------------------------------------------------------------------------------------------------------------- 324 325 326 327 #inputlevel 0 328 329 ;# 下面是替代連發(fā)熱鍵 330 OtherTabndem: 331 ;修改1 332 ;~ Send,{%keys%} 333 MySend(keys) 334 return 335 336 337 EnableClick: 338 ;## 開(kāi)放單擊(根據(jù)需求自己考慮開(kāi)不開(kāi)) 339 MySend(keys) 340 return 341 #inputlevel 342 343 344 345 346 ;--------------------------------------------------------------------------------------------------------------- 347 348 #inputlevel,2 349 ;# 這是舊版發(fā)送方式 350 OldMyKey(){ 351 352 global LongPressWT,TandemWT,TabndemSpeed,Timeout,OP,TA,keys,LongPressLoop,OtherTabndemKey,FF 353 send,{%FF% Down} 354 355 KeyWait, %keys%,T%OldTimeout% 356 { 357 send,{%FF% Up} 358 } 359 return 360 } 361 #inputlevel 362 363 ;重置觸發(fā)器 Reset Trigger 364 RT(){ 365 global TA 366 TA:=0 367 return 368 } 369 370 371 ;設(shè)置觸發(fā)器 Set Trigger 372 ST(){ 373 global TA 374 TA:=1 375 return 376 } 377 378 379 #inputlevel,2 380 381 382 ;--------------------------------------------------------------------------------------------------------------- 383 384 ;位置1 385 ;# 這是新版發(fā)送方式(模式1) 386 MyKey() 387 { 388 ;聲明一下,該函數(shù)內(nèi)使用的全局變量 389 global LongPressWT,TandemWT,TabndemSpeed,Timeout,OP,TA,keys,LongPressLoop,OtherTabndemKey,FF 390 391 ;# 先按下%FF%(便于后面的捕獲) 392 send,{%FF% Down} 393 394 ;# 循環(huán)十次 如果出了循環(huán)之后說(shuō)明用戶是在單獨(dú)長(zhǎng)按,企圖發(fā)送連續(xù)的Tab 395 loop,%LongPressLoop% 396 { 397 ;功能激活在沒(méi)有檢測(cè)到keys被松開(kāi)的時(shí)候功能激活了 398 if (TA==1) 399 { 400 401 KeyWait, %keys%,T%Timeout% 402 { 403 ;~ MsgBox,Tab被釋放,所以%FF%被釋放 404 405 send,{%FF% Up} 406 RT() 407 return 408 } 409 410 ;重置觸發(fā)器 411 send,{%FF% Up} 412 RT() 413 return 414 } 415 ;不管是最后Tab等到了釋放,或者是過(guò)了10秒,程序就結(jié)束了 416 ;重置觸發(fā)器 417 418 ;如果發(fā)現(xiàn)功能沒(méi)有被激活,那就檢查是否Tab已經(jīng)被松開(kāi),如果是的話,再檢查一下觸發(fā)器,如果沒(méi)有觸發(fā),那么說(shuō)明他只是想發(fā)送一個(gè)單獨(dú)的Tab,如果觸發(fā)了,那就釋放%FF%,結(jié)束程序 419 ;如果發(fā)現(xiàn)功能沒(méi)有被激活,先檢查一下Tab是否被松開(kāi),如果被松開(kāi)了那么再確認(rèn)一下功能是否被激活,如果確認(rèn)激活了,那么松開(kāi)即可,如果沒(méi)有被激活發(fā)送一個(gè)Tab松開(kāi) 420 421 ;中途突然發(fā)現(xiàn)keys被松開(kāi)了 422 if !(GetKeyState(keys,"P")) 423 { 424 425 if (TA==0) 426 { 427 send,{%FF% Up} 428 MySend(keys) 429 RT() 430 return 431 } 432 433 ;離開(kāi)的同時(shí)去了其他線程,既然已經(jīng)離開(kāi)了,那么就直接釋放%FF%,什么我感覺(jué)還是可以的 434 send,{%FF% Up} 435 RT() 436 return 437 } 438 439 ;我發(fā)現(xiàn)既沒(méi)激活,都沒(méi)有被松開(kāi),那么就等待50毫秒,如此重復(fù),500毫秒過(guò)去之后,說(shuō)明用戶是想長(zhǎng)按 440 441 ;~ Sleep 50 442 ;改為10 提高靈敏度 443 Sleep 10 444 445 } 446 ;# 500毫秒已經(jīng)過(guò)去,并沒(méi)有觸發(fā)功能,也沒(méi)有松開(kāi)Tab 447 ;## 既然不想觸發(fā)功能,那么就松開(kāi)%FF% 448 449 send,{%FF% Up} 450 ;## 松開(kāi)之后,立即發(fā)送一個(gè)Tab 451 MySend(keys) 452 ;## 等待200毫秒 之后檢查是否松開(kāi) 453 Sleep %TandemWT% 454 ;~ Sleep 200 455 ;等到200毫秒之后,連續(xù)發(fā)送,直到檢查到用戶松開(kāi) 456 ;持續(xù)按下200毫秒,進(jìn)入循環(huán)模式 457 ;只要檢查發(fā)現(xiàn)按下就一直發(fā),如果發(fā)現(xiàn)沒(méi)按下就停下 458 459 loop 460 { 461 462 if !(GetKeyState(keys,"P")) { 463 RT() 464 return 465 break ;如果中途松開(kāi),那就跳出循環(huán), 程序也就結(jié)束了 466 } 467 468 ;如果一直不松開(kāi),就一直發(fā)送下去, 469 else 470 { 471 MySend(keys) 472 473 Sleep %TabndemSpeed% 474 } 475 } 476 477 RT() 478 } 479 return 480 481 482 ;--------------------------------------------------------------------------------------------------------------- 483 484 485 ;# send模式2+ 的函數(shù) 發(fā)送模式2Plus 486 MyKey2_Plus() 487 { 488 ;## 聲明一下,該函數(shù)內(nèi)使用的全局變量 489 global Timeout2 490 491 ;## 按下%FF% (等待被觸發(fā)) 492 send,{%FF% Down} 493 ;## 等待被松開(kāi) 494 ;### 如果是-1那么就一直等,如果不是就等"Timeout2"秒 495 if (Timeout2==-1) 496 KeyWait,%keys% 497 else 498 KeyWait,%keys%,%Timeout2% 499 ;~ KeyWait,%keys%,T1 500 ;### 如果超時(shí)了 501 if (ErrorLevel=1){ 502 ;~ MsgBox,超時(shí) 503 ;#### 釋放%FF% 504 send,{%FF% Up} 505 ;#### 重置計(jì)數(shù)器 506 RT() 507 return 508 } 509 else 510 { 511 ;~ MsgBox 6 512 ;## 松開(kāi)了如果功能已經(jīng)觸發(fā)則不發(fā)出原按鍵,否則就發(fā)出 513 514 515 ;### 如果松開(kāi)之后功能已經(jīng)觸發(fā) 516 if (TA==1){ 517 ;#### 釋放%FF% 518 send,{%FF% Up} 519 ;#### 重置計(jì)數(shù)器 520 RT() 521 522 } 523 ;### 如果松開(kāi)之后功能并觸發(fā),那么就發(fā)出原按鍵即可 524 else 525 { 526 527 ;#### 釋放%FF% 528 send,{%FF% Up} 529 ;#### 重置計(jì)數(shù)器 530 RT() 531 MySend(keys) 532 533 return 534 } 535 } 536 537 538 539 } 540 541 #inputlevel 542 543 544 ;--------------------------------------------------------------------------------------------------------------- 545 546 547 ; # 設(shè)置保存并重啟當(dāng)前腳本的熱字串 ;rl 548 #If WinActive(A_ScriptName) 549 ;###保存并重啟當(dāng)前腳本 550 :?:`;rl:: 551 Sleep 25 552 send ^s 553 Sleep 25 554 Reload 555 return 556 #If 557 558 559 ;--------------------------------------------------------------------------------------------------------------- 560 561 562 563 ;# 以下是用到的函數(shù) 564 565 ;# 檢測(cè)目前CapsLock狀態(tài) 566 CheckCapsLock(){ 567 ;開(kāi)著是1,關(guān)掉是0 568 return GetKeyState("CapsLock","T") 569 } 570 571 572 ;--------------------------------------------------------------------------------------------------------------- 573 574 575 ;# 針對(duì)CapsLock等可切換熱鍵的針對(duì)性優(yōu)化send函數(shù) 576 MySend(ukey){ 577 578 ;# 如果發(fā)現(xiàn)是3種切換鍵,那么不使用Send,而是直接切換,速度會(huì)快很多很多 579 if(FastSwap(ukey)==1) 580 return 581 ;# 如果CapsLock沒(méi)開(kāi),那么就直接發(fā)送即可 582 if(CheckCapsLock()=0){ 583 Send,{%ukey%} 584 return 585 } 586 ;~ /* 587 ;如果發(fā)現(xiàn)并非單字符字母鍵,那么不在該使用場(chǎng)景內(nèi),直接發(fā)送原版,結(jié)束程序 588 else if !(StrLen(ukey)==1){ 589 Send,{%ukey%} 590 return 591 } 592 ;如果大寫是開(kāi)啟的,那么轉(zhuǎn)換為大寫再發(fā)送一下 593 ;~ */ 594 else 595 { 596 StringUpper,ukey,ukey 597 Send,{%ukey%} 598 } 599 return 600 } 601 602 603 ;--------------------------------------------------------------------------------------------------------------- 604 605 ;# 如果發(fā)現(xiàn)是"可切換"按鍵,那么就切換一下,0代表不是"可切換"按鍵,1代表發(fā)送了切換的指令 606 ;## 特別提示,AHK1.3.0新特性,支持用 0/1 代表 OFF/On 但是為了照顧兼容性還是用了字符串 607 ;## 由來(lái):不知道為什么,如果直接send這些可切換鍵的話,切換會(huì)特別慢(幫助文件上說(shuō)可以這么搞),讓人以為是鎖定住了,那沒(méi)辦法,只能用另外的方法。 608 609 FastSwap(ByRef ukey){ 610 thetemp:=CheckOfukey(ukey,1) 611 if (thetemp="0001_輸入的按鍵不是可切換鍵") 612 return 0 613 else if (SubStr(thetemp,1,1)="c") 614 { 615 SetCapsLockState,% GetKeyState("CapsLock","T") ? "OFF" : "On" 616 return 1 617 } 618 else if (SubStr(thetemp,1,1)="n") 619 { 620 621 SetNumLockState,% GetKeyState("NumLock","T") ? "OFF" : "On" 622 return 1 623 } 624 else if (SubStr(thetemp,1,1)="s") 625 { 626 SetScrollLockState,% GetKeyState("ScrollLock","T") ? "OFF" : "On" 627 return 1 628 } 629 return 0 630 631 } 632 633 634 ;--------------------------------------------------------------------------------------------------------------- 635 636 637 ;# CheckOfukey 函數(shù) 檢查"可切換按鍵"的狀態(tài) 638 CheckOfukey(ByRef ukey,returnname:="0"){ 639 TheShow :="" 640 ; # 提取按鍵字符 只有returnname不等于0 才會(huì)返回按鍵的第一個(gè)字母的小寫形式 641 if(returnname!="0"){ 642 TheShow := SubStr(ukey,1,1) 643 StringLower, TheShow, TheShow 644 } 645 646 if(ukey="CapsLock") 647 return % TheShow GetKeyState("CapsLock","T") 648 if(ukey="NumLock") 649 return % TheShow GetKeyState("NumLock","T") 650 if(ukey="ScrollLock") 651 return % TheShow GetKeyState("ScrollLock","T") 652 653 else 654 ;錯(cuò)誤代碼0001 655 return,% "0001_輸入的按鍵不是可切換鍵" 656 } 657 658 ;--------------------------------------------------------------------------------------------------------------- 659 660 ; # checkString 函數(shù) 檢查某字符串中是否含有某關(guān)鍵詞(可以是多個(gè),用|隔開(kāi)即可) 如果有則return 1,沒(méi)有return 0 661 checkString(WaitCheck,TheKey){ 662 Loop,parse,TheKey,`| 663 { 664 if(InStr(WaitCheck,A_LoopField,false,1,1)) 665 return 1 666 } 667 return 0 668 } 669 670 /* 671 672 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 673 ;# 尾巴:這個(gè)腳本的來(lái)龍去脈 674 ;# 作為不平凡而且不滿足的人,我們想盡可能提升操作電腦的效率,比如說(shuō)進(jìn)行文本編輯這件事,那些快捷鍵實(shí)在是太遠(yuǎn)太亂,如果可以用Space作為修飾鍵就很好了。 675 知陽(yáng)(Power-Keys)和Space(SpaceZ)做了大量的嘗試,顯然他們的方案已經(jīng)能夠大幅提高效率,但是比較敏感的群友(比如我和Ever)會(huì)發(fā)現(xiàn),還是對(duì)中文上屏的速度有干擾(因?yàn)槟壳爸形妮斎敕ǖ纳掀列枰聪驴崭?#xff0c;而且主流的輸入法沒(méi)有自定義選項(xiàng))。 676 我本來(lái)想搞一個(gè)無(wú)干擾的方案,但是昨天晚上突然想明白了,無(wú)干擾的方案是不存在的(因?yàn)槟硞€(gè)鍵有長(zhǎng)按和單擊,單擊的速度幾乎是一定要被拖慢的,在最前面舉過(guò)例子),只是干擾的大小罷了,可以說(shuō)以上二位的方案應(yīng)該就是最優(yōu)方案了,Space修飾鍵探索可以結(jié)束了。 677 基于以上認(rèn)識(shí),我就設(shè)計(jì)了一個(gè)可以"把任何按鍵都變成修飾鍵不會(huì)影響任何本身功能"的解決方案,里邊的各個(gè)參數(shù)都可以自定義,你可以再不明白原理的基礎(chǔ)上做出任何你想要的修改(現(xiàn)在可以修改9個(gè)參數(shù),可能還會(huì)再增加一些),我用了一上午的時(shí)間,終于完工了,任何腳本的第一個(gè)版本,一定是有一些問(wèn)題的,您在使用過(guò)程中如果遇到了歡迎向我反饋,我們來(lái)一起完善它。 678 最后,希望我的這個(gè)腳本能夠給您帶來(lái)更高效率的PC操作體驗(yàn)。 ^_^ 679 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 680 681 */?
posted on 2018-10-14 20:49 心如止水_Zen 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/xrvu/p/9787884.html
總結(jié)
以上是生活随笔為你收集整理的AHK-UMSS框架 (AHK通用修饰键解决方案,任何键都是修饰键)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到自己抓大鱼是什么意思
- 下一篇: 【design pattern】工厂方法