Win Tab鍵實現自定義程式列表間的視窗切換

2022-05-09 04:21:07 字數 3833 閱讀 6878

程式是用autohotkey語言寫的,

說明:以自己使用頻率的順序在exelist自定義的程式間切換

切換可以以所有視窗切換,也可以按程式組切換(比如在word視窗間切換)

程式組可以分別定義排除的視窗(比如想啟用qq聊天介面,但是想排除qq主視窗)

切換順序:

如果當前啟用程式在列表內,並有多個同類程式,則優先切換到同類視窗(比如開啟多個word)

否則切換到exelist裡按順序第乙個找到的視窗

使用方法:

按熱鍵後繼續按tab鍵則在所有匹配的視窗間切換,按應用熱鍵則切換到程式視窗,按其他任意虛擬按鍵則指令碼退出

各程式可以分別設定熱鍵,比如word設定為w,excel設定為e,按w就可以切換到word組,繼續按w,會在word視窗間切換

要求:在應用程式名後面增加\加標題名,增加排除的標題名,比如qq.exe排除標題為abc的視窗,則寫qq.exe\abc

在應用程式名後面增加&字母,則為給該類應用增加熱鍵,否則預設為程式名第乙個字母

示例:每個應用程式格式qq.exe\qq&q,因為qq.exe第乙個字母為q,最後的&q可省略,各應用之間用|隔開

#tab:: ;特定視窗間切換

exelist := "excel.exe|winword.exe|potplayermini64.exe|xmind.exe|foxit_reader.exe" ;前面的視窗優先,別忘了.exe字尾

;看當前視窗是否在列表裡,如果在,則標記inlist = 1,並移動到列表第一項

winget, pn, processname, a ;獲取當前視窗應用名,如notepad.exe

inlist := instr(exelist, pn) ? 1 : 0 ;當前視窗在列表裡,記錄變數inlist

if (instr(exelist, pn) > 2) ;當前視窗移到exelist最前面

;通過exelist獲取視窗資訊並存入objtotal和objkeyandnum

;下面的變數說明:i為每個應用找到的有效視窗數

objtotal := {} ;把所有匹配視窗資訊寫入此物件

objkeyandnum := {} ;以熱鍵分組,把匹配的視窗資訊寫入此物件

total := 0 ;記錄所有匹配視窗總數,objtotal用

loop, parse, exelist, |

;獲取快捷鍵k(後面找到的視窗都放在k對應的物件裡)

if instr(a_loopfield, "&") ;自定義了快捷鍵

k := substr(a_loopfield, instr(a_loopfield, "&") + 1) ;&後一位為快捷鍵

else

;獲取排除視窗標題陣列ms

p2 := instr(a_loopfield, "\")

if p2 ;有排除視窗內容

ms := hyf_grep_match(a_loopfield, "(?<=\\).*?(?=\\|&|$)")

;獲取當前應用所有有效視窗列表

winget, idlist, list, ahk_exe %name% ;獲取當前應用所有視窗id

i := 0 ;記錄當前應用提取視窗數

loop,% idlist ;遍歷視窗id,提取想要的視窗

};記錄匹配視窗的各類資訊(關鍵)★★★★★★★★★★★★★★★★★★★★★★★★★★★★

;心得:如果以應用程式為出發點,記錄多個視窗的資料,理解上就需要3維陣列,這結構更像是樹狀的,不是陣列的標準結構

;但是以視窗為出發點,還是簡單的2維陣列,好理解多了。。。

i++total++

;把id值寫入兩個物件,因為索引有兩種方式

objtotal[total] :=

objkeyandnum[k, i] :=

}};該if判斷匹配視窗為0或1個時,特殊處理後,提示資訊並退出指令碼

if (total = 0)

hyf_tooltip("沒有找到視窗,指令碼退出", , 1)

else if (total = 1)

}else if (total = 2) && inlist ;有2個視窗,且當前已在其中1個視窗

;有2個及2個以上匹配視窗時按熱鍵後的操作

num_intotal := inlist ? 2 : 1 ;在列表則直接切換到第2個視窗,否則切換第1個找到的視窗

hyf_winactivate(objtotal[num_intotal].hwnd, "id")

;列出熱鍵列表和視窗列表

key_all := ""

win_all := ""

num_tmp := 0

for k1, v1 in objkeyandnum

for k2, v2 in v1

for k1, v1 in objtotal

win_all .= a_index . ": " . v1.title . "`n"

;這裡開始自定義按鍵並跳轉到相應的程式,指令碼主要功能。

tooltip,% "等待按鍵(tab或數字或字母鍵)`n按其他鍵則指令碼退出。`n`n視窗列表:`n" . win_all

loop ;等待按鍵繼續切換

else if hyf_isword(kp) ;是字母,則判斷是否存在該熱鍵視窗

else

continue

}else ;不存在該快捷鍵視窗

hyf_tooltip("按鍵" . kp . "不是熱鍵,指令碼退出", 2, 1)

continue

}else if hyf_isnum(kp) ;是數字,則直接跳到該視窗

else

hyf_tooltip("按鍵" . kp . "無效,指令碼退出", , 1)

continue

}else

hyf_tooltip("按鍵" . kp . "無效,指令碼退出", , 1)

}return

hyf_grep_match(str, zz) ;全域性正則 }

ms :=

p := 1

while (p := regexmatch(str, zz, m, p + m.len[0]))

ms[a_index] := m

return ms

}hyf_winget(cmd := "title", wintitle := "a") ;不支援pos等多變數輸出命令

hyf_tooltip(str, t := 1, exitscript := 0, x := "", y := "") ;提示t秒並自動消失

}hyf_winactivate(t, m := "") ;可以支援物件的值,m為ahk_後面的值,如id, class, pid, exe等

hyf_getkeyofvalueinobj1(obj, value, key := "") ;獲取單索引引數物件裡的k鍵匹配v值的鍵 裡鍵b的值為3的序號n,則函式引數為(obj, 3, "b"),若為陣列,則key=""

if (key = "")

else

}hyf_waitkeyandreturn(k := "all", t := "") ;t秒內等待按下任意鍵並返回按鍵名或超時(個人修改版)

hyf_isword(char) ;是否字母

hyf_getkeyofvalueinobj2(obj, value, key := "") ;獲取雙索引引數物件裡的k鍵匹配v值的鍵,返回陣列 裡鍵b的值為3的序號m和n,則函式引數為(obj, 3, "b")

o := {}

if (key = "")

}else

}}hyf_isnum(char) ;是否數字

hyf_removetooltip() ;清除tooltip

自定義字典鍵物件

自定義字典鍵物件需要重寫下面3個方法 需要實現以下三個方法,我也是網上查的資料,但是我很好奇,他們怎麼知道要實現這些方法,是從官方文件知道的嗎,還是怎樣,如果有哪位大牛知道,還請賜教。我也查了官方資料,但是一點都看不出來需要實現這幾個方法就行。遵守nscoding協議 copywithzone 這個...

自定義Toast實現自定義Toast布局

平時我們使用toast的時候都是這樣的一種方法 toast toast toast.maketext context,duration 現在我們來自定義下toast的布局,首先看下toast建立時的源 public static toast maketext context context,char...

實現自定義IFormattable

using system using system.collections using system.linq using system.text using system.collections.generic using system.runtime.serialization namespac...