AHK-UMSS框架 (AHK通用修飾鍵解決方案,任何鍵都是修飾鍵)

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 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/xrvu/p/9787884.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flask-sqlalchemy mysql_Flask SQLAlchemy連接到MySQL數據庫

設置代碼&#xff1a;我正在構建一個帶有AngularJS前端的基本Flask應用程序&#xff0c;目前我需要連接到我用Godaddy phpmyadmin托管的MySQL數據庫。這是我的一部分__init__.pyfrom flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemy# Create instnace called a…

有沒有編碼的知識圖譜_沒有人告訴您關于學習編碼的知識-以及為什么如此困難...

有沒有編碼的知識圖譜by Joyce Akiko通過喬伊斯明子 沒有人告訴您關于學習編碼的知識-以及為什么如此困難 (What Nobody Tells You About Learning To Code — And Why That Makes It So Hard) Are you familiar with the article Why Learning to Code is So Damn Hard?您是…

Node.js之HTPP URL

幾乎每門編程語言都會包括網絡這塊,Node.js也不例外。今天主要是熟悉下Node.js中HTTP服務。其實HTTP模塊是相當低層次的&#xff0c;它不提供路由、cookie、緩存等,像Web開發中不會直接使用,但還是要熟悉下&#xff0c;這樣也方便以后的學習。 一、統一資源標識符URL 這個是非常…

串口數據波形顯示_【專題教程第6期】SEGGER的J-Scope波形上位機軟件,RTT模式波形上傳可飆到500KB/S...

【專題教程第6期】SEGGER的J-Scope波形上位機軟件&#xff0c;RTT模式波形上傳速度可狂飆到500KB/S左右說明&#xff1a;1、在實際項目中&#xff0c;很多時候&#xff0c;我們需要將傳感器或者ADC的數值以波形的形式顯示。通常的解決辦法是用串口上位機&#xff0c;USB接口上位…

JavaScript-基礎入門.0014.JavaScript內置對象

2019獨角獸企業重金招聘Python工程師標準>>> 簡單介紹: 說明: 內置對象就是不依賴宿主環境在程序執行之前已經存在的對象,不必顯式的實例化內置對象,前面已經介紹了大部分內置對象,而Global和Math兩個單體內置對象比較特殊,所以單獨講. Global對象: 說明: Js中不屬于…

Java中字符串連接符(+)和append的區別

參考鏈接&#xff1a;https://www.jianshu.com/p/849f1d443b3a 文章結構&#xff1a; 第一部分&#xff1a;對的原理進行分析 第二部分&#xff1a; 和 append 循環對比&#xff08;貼出代碼&#xff0c;以及分別循環后的反編譯字節碼&#xff0c;來對兩者進行對比&#xff09;…

百度seo排名點擊器_SEO整站優化思路 - 百度seo排名點擊

原出處&#xff1a;超級排名系統原文鏈接&#xff1a;SEO整站優化思路 - 超級排名系統整站優化的大體思路包括哪些&#xff1f;下面超級排名系統小編詳細給大家講解下&#xff1a;一、建站優化我們在建立網站之前與建立網站的時候需要做的優化&#xff0c;包括標題優化、描述關…

unity 天空盒_Unity自定義可編程渲染管線(SRP)(二)——編寫第一個自定義SRP

一句話描述&#xff0c;我們可以把SRP分解成兩個部分&#xff0c;分別是SRP Asset&#xff0c;SRP Instance。SRP AssetSRP Asset是一個Unity Asset文件&#xff0c;用來存儲渲染管線的特定配置信息&#xff0c;包含的信息有&#xff1a;游戲物體是否應該投射陰影&#xff1b;使…

構建node.js基礎鏡像_在Android上構建Node.js應用程序

構建node.js基礎鏡像by Aurlien Giraud通過AurlienGiraud 在Android上構建Node.js應用程序 (Building a Node.js application on Android) 第2部分&#xff1a;Express和NeDB (Part 2: Express and NeDB) In Part 1 we saw how to use Termux, a Terminal emulator and Linux …

【design pattern】工廠方法模式和抽象工廠模式

前言 設計模式分為三大類&#xff1a; 創建型模式&#xff1a;工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式&#xff1b; 結構型模式&#xff1a;適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式&#xff1b; 行為型模式&#xff1…

linux中使用隨機數

(1)單純使用rand重復調用n次&#xff0c;就會得到一個0-RAND_MAX之間的偽隨機數&#xff0c;如果需要調整范圍&#xff0c;可以得到隨機數序列后再進行計算。(2)單純使用rand來得到偽隨機數序列有缺陷&#xff0c;每次執行程序得到的偽隨機序列是同一個序列&#xff0c;沒法得到…

mysql 異地備份工具_異地備份簡單實現(mysql)

該腳本只適用于MYISAM引擎&#xff0c;如果需要適用于innodb&#xff0c;請修改備份命令即可。#!/bin/bash#該腳本只能用來備份myisam引擎數據庫#author&#xff1a;vaedit#date:2017/9/18#備份過程function beifen(){BACKDIRdate "%Y-%m-%d-%H"mkdir /backup/$BACKD…

python管理數據庫設計_Pycharm+Django+Python+MySQL開發 后臺管理數據庫

Django框架十分簡單易用&#xff0c;適合搭建個人博客網站。網上有很多教程&#xff0c;大多是關于命令行操作Django&#xff0c;這里分享一些用最新工具進行Django開發過程&#xff0c;主要是PyCharm太強大&#xff0c;不用有點可惜。第一次寫技術開發類的博文&#xff0c;可能…

你鼓舞了我是世界杯主題曲嗎_選擇方法和鼓舞人心的網站列表

你鼓舞了我是世界杯主題曲嗎by Kristoffer Andreasen通過克里斯托弗安德烈森 選擇方法和鼓舞人心的網站列表 (The pick and choose approach and a list of inspirational websites) In the past couple of years I have created quite a few websites. In the beginning, I h…

共享程序集GAC

原文標題&#xff1a; 原文地址&#xff1a;https://www.cnblogs.com/1996V/p/9037603.html 共享程序集GAC 我上面說了這么多有關CLR加載程序集的細節和規則&#xff0c;事實上&#xff0c;類似于mscorlib.dll、System.dll這樣的FCL類庫被引用的如此頻繁&#xff0c;它已經是我…

彈簧觸摸開關原理圖_10年老電工經驗之談:常見的開關電源那些事兒

隨著電控系統中對控制回路安全性要求提高&#xff0c;控制回路的工作電壓是越來越趨于直流低壓化。由此&#xff0c;控制回路內各種使用直流電源的傳感器、中小微型直流繼電器等電器裝置是日益增多。也正因如此&#xff0c;電控系統內不同品牌的開關電源也相應地多了起來。因牽…

erlang mysql連接超時_Erlang數據庫-(一)Erlang與Mysql的連接

下載&#xff1a;http://download.csdn.net/detail/hjhjava/7088277把該文件的東西全部編譯好&#xff0c;然后根據下面的解釋就可以操作Mysql的。很簡單~-record(row,{a1 0, a20}).%% 第一個參數是該鏈接的名字(根據它來操作Mysql)&#xff0c;第二參數是本機號(ip地址)%% &a…

SQL SERVER 中 GO 的用法2

具體不廢話了&#xff0c;請看下文詳解。 12345678910use db_CSharpgoselect *,備注casewhen Grade>90 then 成績優秀when Grade<90 and Grade>80 then 成績良好when Grade<80 and Grade>70 then 成績及格else 不及格endfrom tb_Grade如果只是執行一條語句&…

js中判斷值不等于undefined

文章&#xff1a;JS 中判斷空值 undefined 和 null轉載于:https://www.cnblogs.com/Tpf386/p/9804496.html

reddit_我在3天內瘋狂地審查了Reddit上的50個投資組合,從中學到了什么。

redditI’ve always enjoyed critiquing applicants’ portfolios at the design studio where I work. And I also often ask for feedback on my own designs on Reddit’s webdev subreddit.我一直都很喜歡在我工作的設計工作室里評估申請人的作品集。 我也經常在Reddit的we…