web-dev-qa-db-fra.com

Quelle est la bonne façon d'envoyer Alt + Tab dans Ahk?

D'accord. Je sais que c'est une question très stupide… .. Mais je suis déjà bloqué depuis une heure.

J'ai très peu d'expérience avec ahk, mais j'ai réussi à faire fonctionner chaque script jusqu'à présent sans aucun problème. J'ai exploré les tutoriels ahk mais n'ai trouvé aucune solution jusqu'à présent.

J'essaie de passer à prev. application avec un seul pavé numérique hors touche . J'ai essayé:

!{Tab}

,

{Alt down}{Tab}{Alt up}

Je l'ai essayé avec des délais de veille, multiligne, entre crochets, avec et sans virgule après une commande, etc.

Je suis assez sûr que c'est très simple mais quelque chose que je n'ai pas encore essayé.

Toute suggestion?

15
user5835566
$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
}

EDIT (suggéré par l'utilisateur Ooker):

Le script affiche un menu que vous pouvez choisir.

Voici à quoi ça ressemble:

9
user3419297

Vous ne devriez pas envoyer manuellement alt + tab car il s’agit d’une commande spéciale de windows, utilisez plutôt les commandes AltTab qui le font pour vous.

AltTabMenu ouvre le menu des onglets et sélectionne le programme, tandis que AltTab, ShiftAltTab le parcourent.

h::AltTabMenu  
n::AltTab
m::ShiftAltTab
4
2501

Si vous voulez juste revenir à l’application précédente, utilisez Send,! {Esc}

4
Robert Ilbrink

Il y a quelques problèmes avec Windows 8/10 et des touches comme ctrl-alt-del et alt-tab. Voici une solution: 

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
3
Stepan

Enfin, finalement, j'ai trouvé la raison et quelques "solutions" ici et ici .. Il semble que Windows 8 bloque Ahk {Alt Bas} {Tab} et AltTabMenu et quelques autres clés.

Pour l'instant, j'utilise ceci pour faire défiler les fenêtres:

Send !{ESC} 

Ceci pour afficher le AltTabMenu:

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

Et ceci pour passer à l’application précédente comme suggéré dans l’un des sujets:

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}

Ce serait génial de pouvoir accéder à l’application précédente sans éclabousser AltTabMenu.

0
user5835566

A travaillé pour moi:

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

Il simule le comportement Alt + Tab pour la touche F1.

0
JerryGoyal