Windows 7中的快捷方式,可在相同应用程序的窗口之间切换,例如OS X中的Cmd +`


38

Windows 7中是否有快捷方式可仅在给定应用程序中的窗口之间切换?我非常喜欢OS X中的此功能;在Windows中相当于什么?



<rant>我希望Redmond可以专注于UX并添加更多Windows快捷键,例如此问题。它们为我们提供了我们不想要的东西的99%,但不仅仅是通过使Windows易于使用来使我们的生活更轻松。我想这需要一个初级程序员两个小时才能为其添加新的快捷方式。</ rant>
Pete Alvin

Answers:


45

如果它是任务栏上前十个应用程序之一,则 (Win)+ n(其中n是其位置编号)将选择它并在窗口中循环。(0对于第十个应用程序,请使用(零)。)例如,我将Windows资源管理器和Internet Explorer固定为任务栏上的前两件事,因此可以使用+ 1循环浏览目录和+ 2循环浏览器。


一些奇怪的注意事项:

  • 如果您按住 并键入(和释放)数字n,则Windows将在任务栏上打开第  n个应用程序。n 如上所述,反复点击将在该程序的窗口中循环。如  TranslucentCloud所述,如果您输入Shift+ n,它将以相反的顺序循环通过它们,例如Alt+ Tab 和  Ctrl+ Tab等。

    如果任务栏上的第n个应用程序已固定但未运行,则+ n将启动它。 

  • 但是,如果您从一开始就按住Shift,然后键入n,则Windows将启动该应用程序的新实例(或至少一个新窗口), 即使它已经在运行。  (对于某些不允许多个窗口同时运行的应用程序,例如Windows Media Player,这将失败。)
  • + n似乎不适用于数字小键盘。

1
在扩展任务栏的多屏幕设置上,这似乎不起作用
Erfan 2015年

1
大。Win + Shift + 1则通过窗口反向循环。
TranslucentCloud '18

24

在Windows 7和8中,尽管我没有快捷键可以单独通过键盘使用,但您可以按住鼠标,Ctrl同时单击感兴趣的应用程序的任务栏图标。每次执行此操作时,都会出现一个属于该应用程序的不同窗口来到最前沿。

另外,程序VistaSwitcher设置Win+ F11Alt+ `在当前应用程序的窗口之间切换。(顺便说一句,它的网站说不支持Windows 8,但是在8.1以下我很幸运;到目前为止,我唯一看到的问题是它有时将诸如搜索边栏之类的东西列为打开的窗口。我只是忽略了那,但YMMV。)


2
巨大的生活质量改善。虽然专用热键会更理想,但WIN +#解决方案受到键数量,不良的人体工程学设计和可怕的延迟的严重限制,更不用说在可访问的热键(1-4)和所需的开始栏位置之间产生冲突。
bpcookson

1
VistaSwitcher很漂亮。谢谢你的建议。
达斯汀·奥普拉

您也可以将项目添加到排除列表像在Windows 10的“新通知”和“柯塔娜”
dragon788

1
我喜欢Vista切换器程序。
路加福音

1
看起来像vistaswitcher的后继者,它的名字alt-tab terminator不再具有在同一应用程序之间
切换

23

您可以使用AutoHotkey: www.autohotkey.com

并将此脚本放在这里:

!`:: ; Next window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
    Return
Else
WinGet, List, List, % "ahk_class " ActiveClass
Loop, % List
{
    index := List - A_Index + 1
    WinGet, State, MinMax, % "ahk_id " List%index%
    if (State <> -1)
    {
        WinID := List%index%
        break
    }
}
WinActivate, % "ahk_id " WinID
return

!^`:: ; Last window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
    Return
Else
WinGet, List, List, % "ahk_class " ActiveClass
Loop, % List
{
    index := List - A_Index + 1
    WinGet, State, MinMax, % "ahk_id " List%index%
    if (State <> -1)
    {
        WinID := List%index%
        break
    }
}
WinActivate, % "ahk_id " WinID
return

对我来说效果很好。使用Autohotkey,我还进行了复制/粘贴/撤消,...键,例如Mac。很棒!

时代


2
需要注意以下几点:1)对于Chrome,它将循环所有类似于Chrome的窗口,包括Slack之类的应用程序!2)对于现代应用程序-如果您仅打开一个现代应用程序窗口-它将打开一个随机的其他现代应用程序(即,如果您打开了Calendar且这是唯一打开的现代应用程序,则会打开“设置”,或“体育”或“邮件”等)
柯克·沃尔

@KirkWoll是的。肯定有改进的空间。我没有时间去真正研究一下Autohotkey来实现它……
Seperman

辛苦了,马上就用了,谢谢。要点:WinGet, List返回List变量中的窗口数(与List%n%存储句柄的伪数组相反),因此您可以跳过WinGet, WinClassCount调用并进行检查List。此外,两个热键的代码似乎相同。
Lebenita'9

在Windows 10 64位和Microsoft Office 2016上我无法使用。可以帮忙吗?
路加福音

1
这很好用,但是,无论桌面如何,似乎都可以在所有窗口之间切换。我正在广泛使用任务视图,并且只需要跳过同一桌面上的Windows。
petr 2016年

8

谢谢,Erasmose,但是如果没有该类型的其他窗口,您的autohotkey脚本版本将最小化一个窗口。有时您不知道,最小化是找出问题的烦人方式,因此我如下修改了脚本:

!`::    ; Next window
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
IF WinClassCount = 1
    Return
Else
WinSet, Bottom,, A
WinActivate, ahk_class %ActiveClass%
return

!+`::    ; Last window
WinGetClass, ActiveClass, A
WinActivateBottom, ahk_class %ActiveClass%
return

哦,我还更改了上一类,使用shift而不是ctrl,因为我是其他几个键盘快捷键的后退修饰符。我喜欢自动热键。


1
凉。我根据您的代码以及在Autohotkey论坛上获得的反馈更新了代码。新代码不会像Mac中那样在最小化的窗口中循环。
Seperman

@Seperman如果我也想遍历最小化的窗口怎么办。为此,我必须更改脚本中的什么。
Ghos3t

效果很好,除了在Chrome或基于Chrome /电子的应用程序(例如VS Code和Slack)中无法正常运行外,因为它会循环遍历所有应用程序。
otter.pro

我没有使用窗口类名,而是使用进程名与基于Electron的应用程序和Firefox / Thunderbird配合使用。gist.github.com/snmishra/794c5f41693510c46ba9bedc839696a8上的
萨蒂亚·米什拉

7

一些实现MDI的应用程序提供Ctrl + Tab来在同一应用程序实例下的“文档”之间切换。例如MS Office。但这不是Windows功能,并且取决于应用程序。对于其他软件,有不同的快捷方式。例如,Firefox不提供此功能,但是有一个添加了该功能的附件

此外,这是Windows中提供的键盘快捷键列表

此外,已有有关Windows中键盘快捷键的讨论

希望能有所帮助。


2
另外,某些程序为此使用(Ctrl)+(F6)。(将(Shift)添加为相反的方向。)
Scott

5

Neosmart的Easy Windows Switcher完全可以满足您的需求。

这是Easy Windows Switcher网站上的描述

Easy Window Switcher使切换不同的窗口alt+`像在Mac上一样容易(按alt + backtick)。alt+tab借助Easy Window Switcher,无需 在一百万个不同的打开的窗口之间找到所需的窗口,只需在同一程序的窗口之间切换即可alt+`


1
不“总是”工作。如果我正在使用其他应用程序一段时间,请回来,它将停止工作。
Dushyant Bangal,

4

VistaSwitcher允许或为此功能。它与Windows 10兼容(尽管名称另有说明)。在Windows 8及更高版本上,建议将某些Metro应用添加到排除列表中。

最佳答案是好的,但不适用于将任务栏设置为仅在活动监视器上显示图标的多监视器设置。


Win + n确实可以在具有多个屏幕的W7系统上工作,并且任务栏仅显示在主监视器上–这是您的意思,还是真的有办法使任务栏切换到当前活动的监视器(我想这会分散您的注意力) ?
Lebenita'9


1

同样使用AutoHotkey,更自然的行为:

; Switch between windows of the same application with Alt+(key above Tab)
; Icon: made by Freepik (www.freepik.com), licence CC 3.0 BY
;       from https://www.flaticon.com/free-icon/switch-window_71630
; Script Licence: CC0 (Public Domain)
; Source: https://framagit.org/dr4Ke/AutoHotkey_scripts

KeyName := GetKeyName("sc029")
Menu, Tray, Tip, Switch between windows of the same applications with 'Alt+%KeyName%'

*!SC029::
WinGetClass, ActiveClass, A
WinGet, WinClassCount, Count, ahk_class %ActiveClass%
If WinClassCount = 1
    Return
WinGet, List, List, % "ahk_class " ActiveClass

index := 0
if not GetKeyState("Shift") {
    index := 1
}
;MsgBox, Entering Loop
While GetKeyState("Alt") {
    If GetKeyState("Shift") {
        index := Mod(List + index - 2, List) + 1
    } else {
        index := Mod(List + index, List) + 1
    }
    WinGet, State, MinMax, % "ahk_id " List%index%
    if (State == -1)
    {
        continue
    }
    WinID := List%index%
    WinActivate, % "ahk_id " WinID
    ErrorLevel := 1
    sleep 50
    While (ErrorLevel != 0) and GetKeyState("Alt") {
        KeyWait, sc029, DT1
    }
}
return

1

我创建了一个AutoHotkey脚本,以在与常规Window AppsChrome ShortcutsChrome Apps一起使用的同一应用程序的窗口之间切换。

https://github.com/JuanmaMenendez/AutoHotkey-script-Open-Show-Apps/blob/master/AutoHotkey-script-Switch-Windows-same-App.ahk

额外

在该Github存储库中,还有另一个AutoHotkey脚本可以与此脚本配合使用,因为您将能够使用所需的热键来打开,还原或最小化您的应用程序。

例:

  • F7:: OpenOrShowAppBasedOnExeName("C:\Windows\System32\SnippingTool.exe")
  • F8:: OpenOrShowAppBasedOnWindowTitle("Gmail", "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --app=https://mail.google.com/mail/")

1
这是在Chrome上正确运行的唯一答案,因为它不会将Chrome和基于Electron的应用程序视为相同。它可以完美地在Chrome,VS Code,Slack等上运行。(在极少数情况下,如果Windows的标题发生了更改,它在某些应用程序(例如Mintty / Cygwin,gVim和Powershell)上无法正确循环)
水獭。亲们

0

我创建了一个AutoHotkey脚本,该脚本与Windows Task Switcher(Alt+ Tab)很好地集成在一起,并提供了其所有优点:应用程序窗口的预览,单击选择,箭头键导航,仅激活所需的单个窗口。使用Alt+ `Alt+ Shift+ `(反引号)调用/导航以在具有与当前窗口相同的进程名称的窗口之间循环。我发现它比Win+ 更有用,num因为它适用于任何应用程序(而不需要记住固定的插槽号),窗口预览更大,背景不会模糊,并且可以与Alt+ Tab导航无缝混合。在Windows 10上测试。

主要技巧是通过设置WS_EX_TOOLWINDOW和取消设置从Task Switcher临时隐藏非目标应用程序窗口WS_EX_APPWINDOW。为了在以管理员身份运行的Windows上设置这些Windows样式,需要对AutoHotkey进行签名或以admin身份运行。我在这里遵循了非常简单的签名说明。

一些相关的线程做出了贡献:

!`::
{
   WS_EX_TOOLWINDOW = 0x80
   WS_EX_APPWINDOW = 0x40000
   tw := []
   aw := []

   WinGet, processName, ProcessName, A

   DetectHiddenWindows, Off
   AltTab_window_list(1)

   Loop, %AltTab_ID_List_0%
   {
      wid := AltTab_ID_List_%A_Index%
      WinGet, processName2, ProcessName, ahk_id %wid%

      if (processName2 != processName)
      {
         WinGet, exStyle2, ExStyle, ahk_id %wid%

         if (!(exStyle2 & WS_EX_TOOLWINDOW))
         {
            tw.InsertAt(0, wid)
            WinSet, ExStyle, ^0x80, ahk_id %wid%
         }

         if ((exStyle2 & WS_EX_APPWINDOW))
         {
            aw.InsertAt(0, wid)
            WinSet, ExStyle, ^0x40000, ahk_id %wid%
         }
      }
   }

   Send {Alt Down}{Tab} ; Bring up switcher immediately

   KeyWait, ``, T.25  ; Go to next window; wait .25s before looping
   if (Errorlevel == 0)
   {
      While ( GetKeyState( "Alt","P" ) )
      {
         KeyWait, ``, D T.25
         if (Errorlevel == 0)
         {
            if (GetKeyState( "Shift","P" ))
            {
               Send {Alt Down}{Shift Down}{Tab}
               Sleep, 200
            }
            else
            {
               Send {Alt Down}{Tab}
               Sleep, 200
            }
         }
      }
   }

   Send {Alt Up} ; Close switcher on hotkey release

   for index, wid in tw
   {
      WinSet, ExStyle, ^0x80, ahk_id %wid%
   }

   for index, wid in aw
   {
      WinSet, ExStyle, ^0x40000, ahk_id %wid%
   }
}
return

AltTab_window_list(excludeToolWindows)
{
   global
   WS_EX_CONTROLPARENT =0x10000
   WS_EX_APPWINDOW =0x40000
   WS_EX_TOOLWINDOW =0x80
   WS_DISABLED =0x8000000
   WS_POPUP =0x80000000
   AltTab_ID_List_ =0
   WinGet, Window_List, List,,, Program Manager ; 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
         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 ((excludeToolWindows & (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_ ++
      AltTab_ID_List_%AltTab_ID_List_% :=wid
   }  
   AltTab_ID_List_0 := AltTab_ID_List_
}


糟糕!我们的编辑被划破了。我试图再次把矮胖子放在一起。请检查您的代码是否正确。
斯科特

0

这是我的版本,使用Autohotkey,可与Chrome和Electron应用程序一起使用。它是通过@ user332861的答案进行修改的,因此可以正确区分Chrome和Electron应用程序,例如Slack和Visual Studio Code。(为此,它使用ahk_exe代替ahk_class

!`::    ; Next window if using alt-backtick
    WinGet, ExeName, ProcessName , A
    WinGet, ExeCount, Count, ahk_exe %ExeName%
    If ExeCount = 1
        Return
    Else
        WinSet, Bottom,, A
        WinActivate, ahk_exe %ExeName%
return

!+`::    ; prev window, Alt+shift+backtick
    WinGet, ExeName, ProcessName , A
    WinActivateBottom, ahk_exe %ExeName%
return

0
!`::
#`::
WinGet, ExeName, ProcessName, A
WinActivateBottom, ahk_exe %ExeName%
return

从@ otter.pro的答案简化。这只是在当前应用程序窗口中向后循环。向前骑行可能会导致其他窗口短暂闪烁。由于看不到闪烁可能比双向循环更重要,因此请勿向前循环。此外,此答案允许#`代替!`,因为这是Mac快捷键的组合键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.