Каков правильный способ отправить Alt + Tab в Ahk?

Ok. Я знаю, что это очень глупый вопрос. Но я застрял уже в течение часа.

У меня очень мало опыта работы с ahk, но до сих пор я работал с каждым script без проблем. Я изучил учебники ahk, но не нашел решения до сих пор.

Я пытаюсь переключиться на prev. приложение с одним нажатием клавиши numpad. Я пробовал:

!{Tab}

{Alt down}{Tab}{Alt up}

Я пробовал это с задержками сна, многострочными, многострочными внутри скобок, с запятыми и без запятых после команд и т.д.

Я уверен, что это очень просто, но я еще не пробовал.

Любое предложение?

Ответ 1

$F1:: AltTab()
$F2:: AltTabMenu()

; AltTab-replacement for Windows 8:
AltTab(){
    list := ""
    WinGet, id, list
    Loop, %id%
    {
        this_ID := id%A_Index%
        IfWinActive, ahk_id %this_ID%
            continue    
        WinGetTitle, title, ahk_id %this_ID%
        If (title = "")
            continue
        If (!IsWindow(WinExist("ahk_id" . this_ID))) 
            continue
        WinActivate, ahk_id %this_ID%, ,2
            break
    }
}

; AltTabMenu-replacement for Windows 8:
AltTabMenu(){
    list := ""
    Menu, windows, Add
    Menu, windows, deleteAll
    WinGet, id, list
    Loop, %id%
    {
        this_ID := id%A_Index%
        WinGetTitle, title, ahk_id %this_ID%
        If (title = "")
            continue            
        If (!IsWindow(WinExist("ahk_id" . this_ID))) 
            continue
        Menu, windows, Add, %title%, ActivateTitle      
        WinGet, Path, ProcessPath, ahk_id %this_ID%
        Try 
            Menu, windows, Icon, %title%, %Path%,, 0
        Catch 
            Menu, windows, Icon, %title%, %A_WinDir%\System32\SHELL32.dll, 3, 0 
    }
    CoordMode, Mouse, Screen
    MouseMove, (0.4*A_ScreenWidth), (0.35*A_ScreenHeight)
    CoordMode, Menu, Screen
    Xm := (0.25*A_ScreenWidth)
    Ym := (0.25*A_ScreenHeight)
    Menu, windows, Show, %Xm%, %Ym%
}

ActivateTitle:
    SetTitleMatchMode 3
    WinActivate, %A_ThisMenuItem%
return

;-----------------------------------------------------------------
; Check whether the target window is activation target
;-----------------------------------------------------------------
IsWindow(hWnd){
    WinGet, dwStyle, Style, ahk_id %hWnd%
    if ((dwStyle&0x08000000) || !(dwStyle&0x10000000)) {
        return false
    }
    WinGet, dwExStyle, ExStyle, ahk_id %hWnd%
    if (dwExStyle & 0x00000080) {
        return false
    }
    WinGetClass, szClass, ahk_id %hWnd%
    if (szClass = "TApplication") {
        return false
    }
    return true
}

РЕДАКТИРОВАТЬ (предложено пользователем Ooker):

Сценарий выскакивает меню для вас, чтобы выбрать.

Вот как это выглядит:

Ответ 2

Не следует вручную отправлять alt + tab, так как это специальная команда для Windows, а используйте команды AltTab, которые делают это за вас.

AltTabMenu открывает меню вкладок и выбирает программу, а AltTab, ShiftAltTab перемещаются по ней.

h::AltTabMenu  
n::AltTab
m::ShiftAltTab

Ответ 3

Если вы просто хотите вернуться к предыдущему приложению, используйте Send,! {Esc}

Ответ 4

Есть некоторые проблемы с Windows 8/10 и такими ключами, как ctrl-alt-del и alt-tab. Вот одно из решений:

F1::
  {   
        Send {Alt Down}{Tab} ;Bring up switcher immediately            
        KeyWait, F1, T.5  ; Go to next window; wait .5s before looping
        if (Errorlevel)
       {       
        While ( GetKeyState( "F1","P" ) ) {
            Send {Tab}        
            Sleep, 400 ; wait 400ms before going to next window
        }
    }
        Send {Alt Up} ;Close switcher on hotkey release
}
return

Ответ 5

Работал для меня:

F1::
Send, {ALT DOWN}{TAB}{ALT UP}
return

Он имитирует поведение Alt + Tab для клавиши F1.

Ответ 6

Ну, наконец, я нашел причину и некоторые "решения" здесь и . Кажется, что Windows 8 блокирует Ahk {Alt Down} {Tab} и AltTabMenu и некоторые другие ключи.

Теперь я использую это для прокрутки окон вперед:

Send !{ESC} 

Для отображения AltTabMenu:

Run, "C:\Users\Default\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\Window Switcher.lnk"

И это, чтобы перейти к предыдущему приложению, как предложено в одной из тем:

LCtrl & z:: ; AltTabMenu


state := GetKeyState("Capslock", "T")
if state = 1
SetCapsLockState, Off  ; CapsLock On blocks Task Switching metro window

Send, !{Tab}   ; prevents displaying inactive Task Switching metro window
run, Window Switcher.lnk ; must be in script directory otherwise include path 
WinWait, Task Switching,, 2
KeyWait, Ctrl
Send, {Enter}

if state = 1
SetCapsLockState, On  ; restores CapsLock State
state =

return

#IfWinActive, Task Switching
LCtrl & q::Send, {Right}
LCtrl & a::Send, {Left}

Было бы здорово попасть в предыдущее приложение без всплеска AltTabMenu.

Ответ 7

Если вы хотите сделать несколько "вкладок", то следующая функция должна помочь в этом. Это было по крайней мере собственное решение на моем компьютере с Windows 8.1.

Подход такой:

  • 1) Получить список всех окон
  • 2) Петля 1:
    • найти индекс текущего окна
    • установить индекс для переключения ("текущий" + "смещение")
  • 3) Цикл 2:
    • цикл, пока вы не нажмете индекс для переключения, затем переключите окно

Пример кода AutoHotKey ниже:

; Test switch of 1 window
F1::AltTabFunction(offset:=1)

; Test switch of 2 windows
F2::AltTabFunction(offset:=2)

AltTabFunction(offset:=1)
{
    ; ****************************
    ; Function for switching windows by ALT-TAB (offset = number of windows to "tab")
    ; ****************************
    ; Get list of all windows.
    WinGet, AllWinsHwnd, List
    WinGetTitle, active_title, A ; Get title of active window.

    ; Find index of the current window.
    counter_of_none_hidden_windows := 0 ; Initiate counter for counting only the none-hidden windows.
    Loop, % AllWinsHwnd
    {
        ; Find title for window in this loop.
        WinGetTitle, CurrentWinTitle, % "ahk_id " AllWinsHwnd%A_Index%

        ; From [1]: "Retrieves an 8-digit hexadecimal number representing the extended style of a window.".
        ; [1] : https://autohotkey.com/docs/commands/WinGet.htm
        WinGet, exStyle, exStyle, % "ahk_id" AllWinsHwnd%A_Index%

        ; Skip hidden windows by checking exStyle.
        If !(exStyle & 0x100){
            Continue
        }

        ; Window is not hidden. Increase counter.
        counter_of_none_hidden_windows := counter_of_none_hidden_windows+1

        ; Set flag.
        titles_match := CurrentWinTitle = active_title
        If (titles_match) {
            window_index_to_switch_to := counter_of_none_hidden_windows+offset
            break
        }
    }

    ; Find index of the window to switch to and do the actual switch
    counter_of_none_hidden_windows := 0 ; Initiate counter for counting only the none-hidden windows.
    Loop, % AllWinsHwnd
    {
        ; From [1]: "Retrieves an 8-digit hexadecimal number representing the extended style of a window.".
        ; [1] : https://autohotkey.com/docs/commands/WinGet.htm
        WinGet, exStyle, exStyle, % "ahk_id" AllWinsHwnd%A_Index%

        ; Skip hidden windows by checking exStyle.
        If !(exStyle & 0x100){
            Continue
        }

        ; Window is not hidden. Increase counter.
        counter_of_none_hidden_windows := counter_of_none_hidden_windows+1

        ; Set flag.
        found_window_to_switch_to := counter_of_none_hidden_windows = window_index_to_switch_to

        ; Switch window.
        If (found_window_to_switch_to) {
            ; Get title.
            WinGetTitle, CurrentWinTitle, % "ahk_id " AllWinsHwnd%A_Index%
            ; Activate by title.
            WinActivate, %CurrentWinTitle%
            ; Stop loop.
            break
        }
    }
    return ; Nothing to return
}

Ответ 8

send {Alt down}{tab}
send {Alt up}

Ответ 9

! {Tab} позволяет переключаться между окнами, если вы добавляете спящий режим до и после него.

  • Сон 100
  • Отправить! {Tab}
  • Сон 100