例如,我打开了Notepad,Word和Chrome。如何在AutoHotKey中编写脚本,以便当我按下键盘上的F9键时,它将移动到下一个应用程序?
答案 0 :(得分:7)
尝试:
AltTab_ID_List_ := []
setTimer, updateList, 100
+f9::WinActivate, % "AHK_ID" AltTab_ID_List_[(pointer == 1 or pointer == 0
? AltTab_ID_List_.Count()-1 : --pointer)]
f9::WinActivate, % "AHK_ID" AltTab_ID_List_[++pointer]
updateList:
list := AltTab_window_list()
if (AltTab_ID_List_.MaxIndex() != list.MaxIndex())
AltTab_ID_List_ := list
cur:=WinExist("A")
for e, v in AltTab_ID_List_
if (cur == v)
pointer := AltTab_ID_List_.MaxIndex() == e ? 0 : e, break
return
AltTab_window_list()
{
WS_EX_CONTROLPARENT =0x10000
WS_EX_APPWINDOW =0x40000
WS_EX_TOOLWINDOW =0x80
WS_DISABLED =0x8000000
WS_POPUP =0x80000000
AltTab_ID_List_ := [] ;AltTab_ID_List_ =0
WinGet, Window_List, List ; Gather a list of running programs
id_list =
Loop, %Window_List%
{
wid := Window_List%A_Index%
WinGetTitle, wid_Title, ahk_id %wid%
WinGet, Style, Style, ahk_id %wid%
If ((Style & WS_DISABLED) or ! (wid_Title)) ; skip unimportant windows ; ! wid_Title or
Continue
WinGet, es, ExStyle, ahk_id %wid%
Parent := Decimal_to_Hex( DllCall( "GetParent", "uint", wid ) )
WinGetClass, Win_Class, ahk_id %wid%
WinGet, Style_parent, Style, ahk_id %Parent%
If ((es & WS_EX_TOOLWINDOW)
or ((es & ws_ex_controlparent) and ! (Style & WS_POPUP) and !(Win_Class ="#32770") and ! (es & WS_EX_APPWINDOW)) ; pspad child window excluded
or ((Style & WS_POPUP) and (Parent) and ((Style_parent & WS_DISABLED) =0))) ; notepad find window excluded ; note - some windows result in blank value so must test for zero instead of using NOT operator!
continue
AltTab_ID_List_.push(wid)
}
return AltTab_ID_List_
}
Decimal_to_Hex(var)
{
SetFormat, integer, hex
var += 0
SetFormat, integer, d
return var
}
答案 1 :(得分:0)
我更改了“ errorseven”代码以提高性能(从列表中删除更新计时器)和可用性
!WheelDown::
gosub UpdateWindowsList
Item_ID_List.Push(Item_ID_List.RemoveAt(1))
gosub PrintList
WinActivate, % "AHK_ID" Item_ID_List[1]
return
!WheelUp::
gosub UpdateWindowsList
Item_ID_List.InsertAt(1, Item_ID_List.Pop())
gosub PrintList
WinActivate, % "AHK_ID" Item_ID_List[1]
return
; Update list order
!MButton::
Item_ID_List := Get_Windows_List()
return
UpdateWindowsList:
New_Item_ID_List := Get_Windows_List()
FirstNow := New_Item_ID_List[1]
; Checks if the active program was already on the old list
for index, value in Item_ID_List {
if (value = FirstNow)
break
}
; If the active program is not at the beginning of the list, bring it to the beginning
if (value = New_Item_ID_List[1]) {
while(FirstNow != Item_ID_List[1]) {
RemovedValue := Item_ID_List.RemoveAt(1)
Item_ID_List.Push(RemovedValue)
}
}
; Delete closed items from the old list
TempArray := []
for index, value in Item_ID_List {
for index2, value2 in New_Item_ID_List {
if (value = value2) {
TempArray.push(New_Item_ID_List.RemoveAt(index2))
break
}
}
}
; Updates the old list with new open programs
for index2, value2 in New_Item_ID_List {
TempArray.push(value2)
}
Item_ID_List := TempArray
; If the active program is not at the beginning of the list, bring it to the beginning
while(FirstNow != Item_ID_List[1]) {
RemovedValue := Item_ID_List.RemoveAt(1)
Item_ID_List.Push(RemovedValue)
}
return
Get_Windows_List()
{
WS_EX_CONTROLPARENT =0x10000
WS_EX_APPWINDOW =0x40000
WS_EX_TOOLWINDOW =0x80
WS_DISABLED =0x8000000
WS_POPUP =0x80000000
AltTab_ID_List := [] ;AltTab_ID_List =0
WinGet, Window_List, List ; Gather a List of running programs
id_List =
Loop, %Window_List%
{
wid := Window_List%A_Index%
WinGetTitle, wid_Title, ahk_id %wid%
WinGet, Style, Style, ahk_id %wid%
if ((Style & WS_DISABLED) or ! (wid_Title)) ; skip unimportant windows ; ! wid_Title or
Continue
WinGet, es, ExStyle, ahk_id %wid%
Parent := Decimal_to_Hex( DllCall( "GetParent", "uint", wid ) )
WinGetClass, Win_Class, ahk_id %wid%
WinGet, Style_parent, Style, ahk_id %Parent%
if ((es & WS_EX_TOOLWINDOW)
or ((es & ws_ex_controlparent) and ! (Style & WS_POPUP) and !(Win_Class ="#32770") and ! (es & WS_EX_APPWINDOW)) ; pspad child window excluded
or ((Style & WS_POPUP) and (Parent) and ((Style_parent & WS_DISABLED) =0))) ; notepad find window excluded ; note - some windows result in blank value so must test for zero instead of using NOT operator!
continue
AltTab_ID_List.push(wid)
}
return AltTab_ID_List
}
Decimal_to_Hex(var)
{
Setformat, integer, hex
var += 0
Setformat, integer, d
return var
}
PrintList:
names =
for index, value in Item_ID_List {
WinGetTitle, OutputVar , AHK_ID %value%
frase = % "Item " index " is '" OutputVar "'"
names = %names%%frase%`n
}
ToolTip, %names%
SetTimer, RemoveToolTip, -1000
return
RemoveToolTip:
ToolTip
return