AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵)
?
?
?
?
1 #Warn 2 #NoEnv ; # 禁用環境變量檢查:不檢查空變量是否為"環境變量",可以極大地提高效率 3 #Hotstring EndChars ◎ ; # 熱字串終止符號設置:只把空格作為終止符,(文檔上所說是不能單獨用空格的,最多是空格之外再加一個,所以用◎充數) 4 #Hotstring ? O Z 5 ;~ #SingleInstance force ;# 強制重啟:啟動時如果舊腳本已經運行,不彈出提示,直接關閉舊的之后運行,主要是便于程序的調試和更改 6 ;~ SetStoreCapsLockMode, Off 7 SetTitleMatchMode 2 ;# Title匹配模式:Title只需要包含即可匹配 8 9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10 ; 腳本名稱:AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵) 11 ; 中英文結合:AHK-UMSS (AHK通用修飾鍵解決方案 AutoHotKeyUniversalModifierSymbolsSolution) 12 ; 腳本版本號 v3.0.1 beat 13 ; AHK版本: 1.1.30 14 ; 語言:中文 15 ; 作者:心如止水<QQ:2531574300> <Autohotkey高手群(348016704)> 16 /* 17 # 腳本功能: 可以在Tab本身功能完全不受影響的前提下(包括長按和短按)讓其作為修飾鍵,支持各種參數的自定義,能力比v1.x版本上了一個臺階。 18 ## 提示:只是框架解決方案,里面沒有設置依托Tab設置大量熱鍵,你需要根據自己的情況設置,另外Tab應該也可以改為任何的"非修飾鍵",比如"分號"等等等。潛力無限,等你挖掘。 19 # 衍生版本: 暫無 20 # 下一步的思路:1,支持更多自定義 2,更模塊化面向對象 3,繼續優化注釋做到簡明扼要 4,添加功能更方便(用一句函數可以完成,只需要輸入按鍵和功能延續片段,長的#Include) 21 # 已知問題:1,在長時間發送大寫修飾符的時候,會隔10個左右的字符發送一次小寫字符,但是這個問題幾乎沒影響使用,這個場景太小眾,看了一下沒找出原因,不打算修復,拉長TabndemSpeed會改善,應該是AHK的反應太慢導致的吧。 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 ; ^_^: 如果您有什么新的想法和改進的建議,或者是發現了BUG,歡迎加我的QQ,一起探討改進 :^_^ 28 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 29 ;~ 測試區域 30 31 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 32 /* 33 版本信息: 34 v1.0.2:增補了注釋,Tab單擊改為默認關閉 35 v1.0.3:在名字中加入AHK(AutoHotKey)便于搜索引擎的爬取 36 v1.1.0:1,添加注釋(改造潛力/派生方案) 2,增加注釋"主更新"地址 37 v1.1.1 注釋:剛剛才發現,如果要實現這個思路,必須使用熱鍵自帶的方法,不能使用send的方法,謝謝cobocy的指教,如果您知道幫助文件在哪個地方講過這件事情,歡迎您能夠告訴我,我還沒找到。 38 v1.1.5 1,緊急修復BUG,level3沒有加return,會導致出現誤觸發,已修復,感謝@長島的雪 的報告 2,增加了"關于響應速度的說明"等注釋 39 v2.0beat:這個版本的機制和之前的版本是完全不同的,所以兩條線更新,類似AHKL和AHK2,有關系,但是區別很大。 40 v2.0.1beat:1,修復MsgBox %LongPressLoop%測試語句忘記注釋的BUG 2,解決了開頭的腳本信息錯誤的問題,增加了一些內容 41 v2.0.2beta :改為更容易被檢索和理解的名字,AHK-UMSS (AHK通用修飾符解決方案 AutoHotKeyUniversalModifierSymbolsSolution) 42 v2.0.3beta :增加了最后的"尾巴:偉大的征途 - 這個腳本的來龍去脈"的注釋 43 v2.0.4beta :實現了按鍵變量的自定義 44 v2.0.5beta :1,支持舊版Tab++1.x的熱鍵方式(其實更適合大多數人的情況,默認就是用這個) 2,支持一鍵修改熱鍵 45 v2.1.0 :1,"熱鍵白名單" 注釋增補 2,新增3模式,表示采用禁用單擊發送修飾鍵的OldKey模式 3,Old等待時間單獨用一個變量來表示 4,增加快速為當前修飾鍵添加連發熱鍵的方法 5,加入"設置保存并重啟當前腳本的熱字串" 6,"跳板熱鍵(中轉鍵)可更改" 7.感謝"沉默不語"的BUG反饋 46 v2.1.1 :解決一個會導致程序失效的嚴重問題 47 v2.1.2 :1,修復CapsLock開啟時,無法正常發送大寫字母的問題,感謝 @丶行者先生、 的反饋 2,改TabndemSpeed=25 為 TabndemSpeed=35 48 v2.1.3 :1,使用函數ST()設置觸發器,讓程序可復用性更好 2,加了一些注釋 49 v2.5 beat :1,修復了CapsLock等3個可切換鍵,無法切換的問題,感謝 @丶行者先生、 的反饋 2,默認send模式改為2 50 v2.61 beat :1,增加了send模式2+,并且改為默認 2,為了程序的簡潔和可讀性,不再采用"一鍵默認設置" 3,優化了send模式選擇錯誤提示框顯示的方式 51 v3.0 beat :新增了一種功能添加方法(新的被叫做方法1,之前的被叫做方法2),該方法非常靈活,支持通過語境約束定義熱鍵(可以實現三按鍵) 52 v3.01 beat :1,注釋掉一處不該有的MsgBox(調試時剩下的) 2,注釋繼續優化 3,自動執行段上方微調 53 */ 54 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 55 56 ;# 定義:制表符xx指的就是發送{Tab},功能xx指的就是以Tab為組合鍵執行的任務,比如F20 & j。 57 58 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 59 /* 60 # 關于響應速度的說明 61 ## 長按必定導致單擊速度變慢:例如用戶按下一個鍵會停留50毫秒左右,如果該鍵沒有長按功能,那么只要檢測到用戶按下這個鍵, 在其手指沒有離開的時候,可能幾毫秒的時間之內這個鍵的功能就已經被激發了;但是如果這個鍵設置了長按功能,那么只要用戶的手指沒有離開,系統就無法分辨到底是長按還是短按,命令就不能發送,直到用戶的手指離開或者時間已到才可以采取相應的動作,人短按的時候肯定是不如機器快的,那么"只要按鍵開啟了長按,短按的效率必定下降"。 62 63 # UMSS針對該問題的方法: 64 ## 廣泛的自定義:既然速度降低,是不可避免的,那么就應該有一個可以完全自定義的方案,UMSS就是如此。你可以選擇好幾種模式。 65 66 ## 四種模式供你選擇 九個參數均可自定義 兩種不同的功能添加方法 67 68 ### 模式1 修飾鍵功能保全方案:修飾鍵的完整功能被保留。在這個模式下修飾鍵是可以發送自己的,比如修飾鍵為Tab,那么 無論是短按還是長按都是可以正常發送Tab的,長按的,連發效果也保留。這個模式下的諸多參數,你可以自定義,以便調整到一個最適合你的(默認方案應該適合大多數人,所以說如果不是遇到問題,那就先不用調) 69 ### 模式2 可單擊修飾鍵方案:在方案二的基礎上,如果快速的單擊的話,是可以發送修飾鍵本身的。(但是有一定時間限制,長按時間超過大約1秒就不會再發送) 70 ### 模式2+ 可單擊修飾鍵方案Plus:在方案二的基礎上可以自定義"等待時間"(Timeout2),從 1s到無窮 可以自定義 71 ### 模式3 完全修飾鍵方案:這個很好理解,也就是修飾鍵無法發送自己(大多修飾鍵都如此)。不過如果在此模式下你要用修飾鍵本身,方案就是啟用組合熱鍵來替代發送功能(包括連發也可以一并解決),程序內置了OtherTabndemKey,你可以通過修此參數一鍵設置。 72 73 ## 心如止水的方案:我個人的方案就是讓Tab安安靜靜的做他的修飾鍵,我把send{Tab}的功能外包給了CapsLock+Space,主要是和我的語音識別鍵是離得很近的,在我的思維導圖軟件iThoughts用起來很爽,所以就習慣了。 74 ## 特別提示:主要的作用是把非修飾鍵當做修飾鍵來用,所以:1,已經是修飾鍵的例如(Ctrl)不能用 2,一定有延遲,所以對延遲敏感的場景不能用(比如字母,會影響打字速度) 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 ;# 設置詳細說明 87 88 ;# 全局生效設置 89 ;## 被修改為修飾鍵的鍵 Keys(String) :無需多解釋,默認是Tab。如果使用分號等,不要忘記轉義。 90 ;## 替代連發按鍵 OtherTabndemKey(String) :可以設置一個熱鍵(與當前修飾鍵),來專門連發當前修飾鍵,以彌補Tab1.x中按鍵無法連發的問題(默認不開啟留空,如果想開啟,填入對應按鍵就可以,比如global OtherTabndemKey:="u") 91 ;## (已經棄用)是否強制使用默認參數 OP(0|1):0的意思是關閉,1是打開 92 ;## 中轉鍵 FF(String):中轉熱鍵是為更好的實現程序迫不得已的選擇,好在系統內置了F13-F24,平常根本就用不到,所以剛好拿來做中轉。提供更改中轉鍵的選項,是因為很多用戶可能會同時使用多個修飾鍵,如果不重新定義,那就會沖突。 93 94 ;# 在"模式1 功能保全方案"中起效的設置 95 ;## 長按等待組合鍵觸發時間 LongPressWT(ms):在模式1中,系統會等待您一段時間,在這個時間段內,如果按下組合鍵則觸發功能,否則就不觸發功能,而是發送修飾符本身。該項就是設置此時間段的。 96 ;## 修飾符連發等待時間 TandemWT(ms):在模式1中,如果已經超過了等待時間,程序會進入發送本身模式,但是在連續發送之前會有一段時間的停頓(Windows正常的連發就是如此)。該項就是設置該停頓的。 97 ;## 修飾符連發速度 TandemSpeed(ms):在模式1中,進入了實質性的連發階段,雖然叫做連發,其實還是有一小段的間隔的,發送的快了,不好掌握(Windows正常的連發就是如此)。該項就是設置該小段間隔的。 98 ;## 功能連發超時 Timeout(s):特別提示的是,TimeOut的單位和別的不一樣,不是毫秒而是 秒。在模式1中,進入了功能的連發階段,連續發送很長的一段時間之后,為了防止出現BUG,連發會停止(因為一般人也用不到連發五秒,基本上半屏幕符號了)。該項就是設置功能連發上限時間的。 99 100 ;# 在"模式2 可單擊修飾鍵方案"以及"模式3 完全修飾鍵方案"中起效的設置 101 ;## Old版本按下等待時間 OldTimeout(s):在Old模式下,和windows本身的不同,修飾鍵按下是有等待時間的(比如按下5秒內可以觸發)。該項就是設置該等待時間的。 102 103 ;# 在"模式2+"的設置 104 ;## Timeout2(S),在Timeout2內,長按keys,只要功能沒有觸發,松開后都會發送keys本身。默認是無窮,也就是-1,可以重新自己設置(最少1s)。 105 ;--------------------------------------------------------------------------------------------------------------- 106 107 ;# 添加新的功能 108 ;# 這只是一個框架,所以里面基本上沒裝什么功能,就只是裝了一個按下jk分別左右移動的功能。 109 ;# 裝功能的話你搜一下"<<<<<<<<<<<<功能添加區>>>>>>>>>>>>"就行了 110 111 ;# 強制使用默認模式:1表示強制使用默認參數,0表示采用自定義參數 112 ;## 為了程序的可讀性,該設置取消 113 ;~ global UseDefault:=0 114 115 ;--------------------------------------------------------------------------------------------------------------- 116 117 ;# 不可自定義參數 118 119 ;# TA是功能被觸發計數器,1表示有Tab功能已經被觸發,0表示并沒有,所以每個功能都要以TA=1結尾,告訴程序功能已經觸發了。 120 121 122 global TA:=0 123 ;# 通過用戶輸入的長按等待時間計算檢測循環次數 124 ;~ global LongPressLoop :=Ceil(500/50) 125 ;改為10,提高靈敏度 126 global LongPressLoop :=Ceil(500/10) 127 128 ;--------------------------------------------------------------------------------------------------------------- 129 130 131 ;# 可自定義參數 132 133 ;## 全局設置 134 135 ;### 請選擇模式 模式1-修飾鍵功能保全方案 模式2-可單擊修飾鍵方案 模式2+ 可單擊修飾鍵方案Plus 模式3-完全修飾鍵方案 136 global MySendMode:="2+" 137 138 ;### 選擇要變成修飾鍵的按鍵 139 global keys:="Tab" 140 141 ;### 一鍵設置替代組合鍵(默認關閉) 142 global OtherTabndemKey:="" 143 144 ;### 設置"中轉鍵" 145 global FF:="F20" 146 147 ;### 設置連發時間上限 148 Timeout=5 ;單位是s 149 150 ;## 為模式1設置參數 151 152 LongPressWT=500 ;### 判斷為長按的時間 153 TandemWT=180 ;### 進入發送模式后,第一個發送與連發的間隔 154 TabndemSpeed=35 ;### 進入連發模式后,連發之間的間隔 155 156 ;## 為模式2&3設置參數 157 158 ;### 功能組合鍵等待時間(過了等待時間不會響應功能組合鍵) 159 OldTimeout=5 ;單位是s 160 161 ;## 為模式2+設置參數 162 163 ;### 按鍵等待時間(過了等待時間,松手也不會發送按鍵本身,也不會響應功能,-1代表無限) 164 Timeout2=-1 ;單位是s,-1代表無限(實際上<=0都代表無限) 165 166 ;--------------------------------------------------------------------------------------------------------------- 167 168 169 170 ;通過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 中注冊 單擊映射 的地方 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,模式選擇出現錯誤,錯誤的 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 ;如果不為空就注冊熱鍵,用于修飾鍵自身的連發 210 if !(OtherTabndemKey=""){ 211 212 Hotkey,%keys% & %OtherTabndemKey%,OtherTabndem,I0 213 } 214 215 ; # 注冊主功能熱鍵(請放在最后,因為會干擾自動執行段) 216 domain() 217 218 ; # 自動執行段結束 219 return 220 221 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 222 223 ;# 熱鍵白名單(如果使用此腳本之后,系統或其它應用的相關熱鍵出現問題無法使用,可以把熱鍵添加到這個名單中。新版本已經基本修復了這個問題,但是還留著以防后患吧。) 224 225 #inputlevel,3 226 227 ;## 在這個層級是不覆蓋系統默認鍵的,可以設置系統默認鍵的白名單 228 ;~的意思是不覆蓋系統本身的快捷鍵 229 230 ;### 為了能讓系統的窗口切換可以正常運行,以Level3的速度發送這些按鍵,避免受到干擾 231 ;位置0 232 ;# 注意 每個系統熱鍵下面,必須加return 233 /* 234 235 ~!Tab:: 236 return 237 ~#Tab:: 238 */ 239 return 240 241 242 #inputlevel 243 244 245 ;--------------------------------------------------------------------------------------------------------------- 246 247 248 ;<<<<<<<<<<<<功能添加方法1:示例功能區(推薦)>>>>>>>>>>>> Start 249 #If GetKeyState(keys,"p") ;## 語境約束:意思是當keys被實際按下時,一下內容就生效 250 251 252 q:: 253 ST() ;## 這個函數的意思是告訴程序已經觸發功能,所以不需要再等,send模式1和send模式2+用得到,send模式2-3用不到 254 MsgBox,成功觸發 `n %keys%+q 熱鍵 255 return 256 257 ;## 方法1的優勢:方法1 很靈活,可以搭配系統中其他的修飾鍵,做到定義3快捷鍵 ,而且你也可以使用語境約束來適配更多情景,比如當Word存在時(下面有例子)。 258 !q:: 259 ST() 260 MsgBox,成功觸發 `n Alt+%keys%+q 熱鍵 261 return 262 263 ;## 兩種方法的優先級:當方法1和方法2沖突時,方法2優先,在這里Keys+k代表向右移動2次,在模式2中是1次,只有注釋方法2中的內容,才能移動2次。 264 k:: 265 ST() 266 send,{right 2} 267 return 268 return 269 270 #If ;## 語境約束結束 271 272 273 ;--------------------------------------------------------------------------------------------------------------- 274 275 #If GetKeyState(keys,"p") AND WinExist("ahk_exe WINWORD.EXE") ;## 語境約束:意思是當keys被實際按下并且Word.exe窗口存在時,生效 276 277 !w:: 278 ST() 279 MsgBox,成功觸發 `n Alt+%keys%+w 熱鍵 280 return 281 282 #If ;## 語境約束結束 283 284 285 ;<<<<<<<<<<<<功能添加方法1:示例功能區(推薦)>>>>>>>>>>>> End 286 287 288 289 ;--------------------------------------------------------------------------------------------------------------- 290 291 292 293 ;<<<<<<<<<<<<功能添加方法2:功能添加區>>>>>>>>>>>> Start 294 domain(){ 295 global LongPressWT,TandemWT,TabndemSpeed,Timeout,OP,TA,keys,LongPressLoop,OtherTabndemKey,FF 296 297 ;# 注冊熱鍵等等被激發 298 Hotkey,%FF% & j,Kj,I0 ;這是注冊熱鍵的意思,%FF% & j中的"%FF%"就是你填的中轉鍵,這個不用動,默認是F20,& 就是并且的意思,%FF% & j就是"當你的修飾鍵和j鍵同時按下時",kj是函數名,是要執行的功能,在下方的功能區可以自己填。I0,指的是接收等級inputlevel,具體的意思可以看幫助文件,大多數時候根本用不到,也不用去碰。 299 Hotkey,%FF% & k,Kk,I0 300 return 301 302 } 303 304 305 Kj(){ ;這個地方是函數名,命名規則是字符k+按鍵名,比如用修飾鍵配合j觸發的,就叫做Kj,這不是硬性規定,只不過我覺得這樣的話可讀性會好。 306 ST() ;這個函數的意思是告訴程序已經觸發功能,所以不需要再等,模式1和模式2+用得到,模式2-3用不到 307 308 send,{Left} ;然后這個地方就可以增加語句了,就是你的功能,這里是發送"向左",怎么做隨你。如果功能代碼量大,為了可讀性建議使用#Include導入。 309 return ;不要忘記加return 310 } 311 312 313 Kk(){ 314 ST() 315 send,{right} 316 return 317 } 318 319 ;<<<<<<<<<<<<功能添加方法2:示例功能區>>>>>>>>>>>> End 320 321 322 323 ;--------------------------------------------------------------------------------------------------------------- 324 325 326 327 #inputlevel 0 328 329 ;# 下面是替代連發熱鍵 330 OtherTabndem: 331 ;修改1 332 ;~ Send,{%keys%} 333 MySend(keys) 334 return 335 336 337 EnableClick: 338 ;## 開放單擊(根據需求自己考慮開不開) 339 MySend(keys) 340 return 341 #inputlevel 342 343 344 345 346 ;--------------------------------------------------------------------------------------------------------------- 347 348 #inputlevel,2 349 ;# 這是舊版發送方式 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 ;重置觸發器 Reset Trigger 364 RT(){ 365 global TA 366 TA:=0 367 return 368 } 369 370 371 ;設置觸發器 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 ;# 這是新版發送方式(模式1) 386 MyKey() 387 { 388 ;聲明一下,該函數內使用的全局變量 389 global LongPressWT,TandemWT,TabndemSpeed,Timeout,OP,TA,keys,LongPressLoop,OtherTabndemKey,FF 390 391 ;# 先按下%FF%(便于后面的捕獲) 392 send,{%FF% Down} 393 394 ;# 循環十次 如果出了循環之后說明用戶是在單獨長按,企圖發送連續的Tab 395 loop,%LongPressLoop% 396 { 397 ;功能激活在沒有檢測到keys被松開的時候功能激活了 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 ;重置觸發器 411 send,{%FF% Up} 412 RT() 413 return 414 } 415 ;不管是最后Tab等到了釋放,或者是過了10秒,程序就結束了 416 ;重置觸發器 417 418 ;如果發現功能沒有被激活,那就檢查是否Tab已經被松開,如果是的話,再檢查一下觸發器,如果沒有觸發,那么說明他只是想發送一個單獨的Tab,如果觸發了,那就釋放%FF%,結束程序 419 ;如果發現功能沒有被激活,先檢查一下Tab是否被松開,如果被松開了那么再確認一下功能是否被激活,如果確認激活了,那么松開即可,如果沒有被激活發送一個Tab松開 420 421 ;中途突然發現keys被松開了 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 ;離開的同時去了其他線程,既然已經離開了,那么就直接釋放%FF%,什么我感覺還是可以的 434 send,{%FF% Up} 435 RT() 436 return 437 } 438 439 ;我發現既沒激活,都沒有被松開,那么就等待50毫秒,如此重復,500毫秒過去之后,說明用戶是想長按 440 441 ;~ Sleep 50 442 ;改為10 提高靈敏度 443 Sleep 10 444 445 } 446 ;# 500毫秒已經過去,并沒有觸發功能,也沒有松開Tab 447 ;## 既然不想觸發功能,那么就松開%FF% 448 449 send,{%FF% Up} 450 ;## 松開之后,立即發送一個Tab 451 MySend(keys) 452 ;## 等待200毫秒 之后檢查是否松開 453 Sleep %TandemWT% 454 ;~ Sleep 200 455 ;等到200毫秒之后,連續發送,直到檢查到用戶松開 456 ;持續按下200毫秒,進入循環模式 457 ;只要檢查發現按下就一直發,如果發現沒按下就停下 458 459 loop 460 { 461 462 if !(GetKeyState(keys,"P")) { 463 RT() 464 return 465 break ;如果中途松開,那就跳出循環, 程序也就結束了 466 } 467 468 ;如果一直不松開,就一直發送下去, 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+ 的函數 發送模式2Plus 486 MyKey2_Plus() 487 { 488 ;## 聲明一下,該函數內使用的全局變量 489 global Timeout2 490 491 ;## 按下%FF% (等待被觸發) 492 send,{%FF% Down} 493 ;## 等待被松開 494 ;### 如果是-1那么就一直等,如果不是就等"Timeout2"秒 495 if (Timeout2==-1) 496 KeyWait,%keys% 497 else 498 KeyWait,%keys%,%Timeout2% 499 ;~ KeyWait,%keys%,T1 500 ;### 如果超時了 501 if (ErrorLevel=1){ 502 ;~ MsgBox,超時 503 ;#### 釋放%FF% 504 send,{%FF% Up} 505 ;#### 重置計數器 506 RT() 507 return 508 } 509 else 510 { 511 ;~ MsgBox 6 512 ;## 松開了如果功能已經觸發則不發出原按鍵,否則就發出 513 514 515 ;### 如果松開之后功能已經觸發 516 if (TA==1){ 517 ;#### 釋放%FF% 518 send,{%FF% Up} 519 ;#### 重置計數器 520 RT() 521 522 } 523 ;### 如果松開之后功能并觸發,那么就發出原按鍵即可 524 else 525 { 526 527 ;#### 釋放%FF% 528 send,{%FF% Up} 529 ;#### 重置計數器 530 RT() 531 MySend(keys) 532 533 return 534 } 535 } 536 537 538 539 } 540 541 #inputlevel 542 543 544 ;--------------------------------------------------------------------------------------------------------------- 545 546 547 ; # 設置保存并重啟當前腳本的熱字串 ;rl 548 #If WinActive(A_ScriptName) 549 ;###保存并重啟當前腳本 550 :?:`;rl:: 551 Sleep 25 552 send ^s 553 Sleep 25 554 Reload 555 return 556 #If 557 558 559 ;--------------------------------------------------------------------------------------------------------------- 560 561 562 563 ;# 以下是用到的函數 564 565 ;# 檢測目前CapsLock狀態 566 CheckCapsLock(){ 567 ;開著是1,關掉是0 568 return GetKeyState("CapsLock","T") 569 } 570 571 572 ;--------------------------------------------------------------------------------------------------------------- 573 574 575 ;# 針對CapsLock等可切換熱鍵的針對性優化send函數 576 MySend(ukey){ 577 578 ;# 如果發現是3種切換鍵,那么不使用Send,而是直接切換,速度會快很多很多 579 if(FastSwap(ukey)==1) 580 return 581 ;# 如果CapsLock沒開,那么就直接發送即可 582 if(CheckCapsLock()=0){ 583 Send,{%ukey%} 584 return 585 } 586 ;~ /* 587 ;如果發現并非單字符字母鍵,那么不在該使用場景內,直接發送原版,結束程序 588 else if !(StrLen(ukey)==1){ 589 Send,{%ukey%} 590 return 591 } 592 ;如果大寫是開啟的,那么轉換為大寫再發送一下 593 ;~ */ 594 else 595 { 596 StringUpper,ukey,ukey 597 Send,{%ukey%} 598 } 599 return 600 } 601 602 603 ;--------------------------------------------------------------------------------------------------------------- 604 605 ;# 如果發現是"可切換"按鍵,那么就切換一下,0代表不是"可切換"按鍵,1代表發送了切換的指令 606 ;## 特別提示,AHK1.3.0新特性,支持用 0/1 代表 OFF/On 但是為了照顧兼容性還是用了字符串 607 ;## 由來:不知道為什么,如果直接send這些可切換鍵的話,切換會特別慢(幫助文件上說可以這么搞),讓人以為是鎖定住了,那沒辦法,只能用另外的方法。 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 函數 檢查"可切換按鍵"的狀態 638 CheckOfukey(ByRef ukey,returnname:="0"){ 639 TheShow :="" 640 ; # 提取按鍵字符 只有returnname不等于0 才會返回按鍵的第一個字母的小寫形式 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 ;錯誤代碼0001 655 return,% "0001_輸入的按鍵不是可切換鍵" 656 } 657 658 ;--------------------------------------------------------------------------------------------------------------- 659 660 ; # checkString 函數 檢查某字符串中是否含有某關鍵詞(可以是多個,用|隔開即可) 如果有則return 1,沒有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 ;# 尾巴:這個腳本的來龍去脈 674 ;# 作為不平凡而且不滿足的人,我們想盡可能提升操作電腦的效率,比如說進行文本編輯這件事,那些快捷鍵實在是太遠太亂,如果可以用Space作為修飾鍵就很好了。 675 知陽(Power-Keys)和Space(SpaceZ)做了大量的嘗試,顯然他們的方案已經能夠大幅提高效率,但是比較敏感的群友(比如我和Ever)會發現,還是對中文上屏的速度有干擾(因為目前中文輸入法的上屏需要按下空格,而且主流的輸入法沒有自定義選項)。 676 我本來想搞一個無干擾的方案,但是昨天晚上突然想明白了,無干擾的方案是不存在的(因為某個鍵有長按和單擊,單擊的速度幾乎是一定要被拖慢的,在最前面舉過例子),只是干擾的大小罷了,可以說以上二位的方案應該就是最優方案了,Space修飾鍵探索可以結束了。 677 基于以上認識,我就設計了一個可以"把任何按鍵都變成修飾鍵不會影響任何本身功能"的解決方案,里邊的各個參數都可以自定義,你可以再不明白原理的基礎上做出任何你想要的修改(現在可以修改9個參數,可能還會再增加一些),我用了一上午的時間,終于完工了,任何腳本的第一個版本,一定是有一些問題的,您在使用過程中如果遇到了歡迎向我反饋,我們來一起完善它。 678 最后,希望我的這個腳本能夠給您帶來更高效率的PC操作體驗。 ^_^ 679 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 680 681 */
?
posted on 2018-10-14 20:49 心如止水_Zen 閱讀(...) 評論(...) 編輯 收藏