在Ahk中发送Alt + Tab的正确方法是什么?

时间:2016-03-13 14:27:44

标签: autohotkey

确定。我知道这是一个非常愚蠢的问题。 但是我已经被困了一个小时了。

我对ahk的经验很少,但是到目前为止,每个脚本都没有问题。我探讨了ahk教程,但到现在为止找不到任何解决方案。

我试图切换到prev。应用程序只有一个小键盘关键。 我试过了:

!{Tab}

{Alt down}{Tab}{Alt up}

我已尝试过睡眠延迟,多行,多行内括号,命令后有逗号和无逗号等等。

我很确定这很简单,但我还没有尝试过。

有什么建议吗?

11 个答案:

答案 0 :(得分:10)

$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 ):

该脚本会弹出一个菜单供您选择。

这就是它的样子:

答案 1 :(得分:5)

您不应手动发送alt + tab,因为它是一个特殊的Windows命令,而是使用为您执行此操作的AltTab commands

AltTabMenu打开标签菜单并选择该计划,而AltTabShiftAltTab会浏览该计划。

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

答案 2 :(得分:4)

如果您只想切换回上一个应用程序,请使用发送,!{Esc}

答案 3 :(得分: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

答案 4 :(得分:2)

我的个人目标是将Alt-Tab映射到Win-Tab(因为我在Windows 10上使用Mac键盘),所以我采用了Stepan上面写的内容以及一些文档,这里的内容对我来说很好:

#Tab::
{   
  Send {LAlt Down}{Tab}          
  KeyWait, LWin  ; Wait to release left Win key
  Send {LAlt Up} ; Close switcher on hotkey release
}
return

答案 5 :(得分:1)

为我工作:

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

它模拟F1键的Alt + Tab行为。

答案 6 :(得分:0)

好吧,最后我找到了原因和一些“解决方案”herehere。 似乎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 :(得分:0)

如果您要执行多个“制表符”,则下面的功能应该可以帮助您做到这一点。这至少是我的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 :(得分:0)

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

答案 9 :(得分:0)

!{Tab}可在您在窗口前后添加睡眠的情况下在窗口之间切换。

  • 睡眠100
  • 发送!{Tab}
  • 睡眠100

答案 10 :(得分:-3)

我认为这个问题只是一个简单的请求:由于win10改变了事情,如何使用AHK在Win10中更改选项卡? ->我找到了最简单的解决方案,如下所示...代码使得在Win10 emu打开时必须按住alt键-然后再使用箭头键添加更多标签页(如果需要三个alt标签页,然后是“ alt选项卡,然后是右边2”,看到了吗?

macro key name::

{
        Sleep 100
        Send, ^c
        Sleep 1000
        Send, {alt down}{tab}
        Sleep 400
        Send, {right 2}{alt up}
        Sleep 400
        Send, ^v
        Sleep 400
}

因此,只需在代码中使用此片段即可,您可以跳过打开的“下一个”窗口。 罗斯曼