程式是用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...