AutoHotKey:按键时移动到下一个程序

时间:2017-10-05 03:31:44

标签: autohotkey

例如,我打开了Notepad,Word和Chrome。如何在AutoHotKey中编写脚本,以便当我按下键盘上的F9键时,它将移动到下一个应用程序?

2 个答案:

答案 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