Ярлык в Windows 7 для переключения между окнами одного и того же приложения, как Cmd + `в OS X

38

Есть ли в Windows 7 ярлык для переключения между окнами только в данном приложении? Мне очень нравится эта функция в OS X; каков его эквивалент в Windows?

jiejieup
источник
<rant> Я бы хотел, чтобы Редмонд сосредоточился на UX и добавил больше сочетаний клавиш Windows, как для этого вопроса. Они дают нам 99% того, что нам не нужно, но не только облегчают нашу жизнь, облегчая использование Windows. Я полагаю, что младшему программисту потребуется всего два часа, чтобы добавить новый ярлык для этого. </ Rant>
Пит Элвин,

Ответы:

45

Если это одно из первых десяти приложений на панели задач, то (Win)+ n, где n - это номер его позиции, выберет его и переключится между окнами. (Используйте 0(ноль) для десятого приложения.) Например, у меня Windows Explorer и 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
1
Отлично. И Win + Shift + 1 циклически перебирает окна.
TranslucentCloud
24

В Windows 7 и 8, хотя я не знаю доступных ярлыков на одной только клавиатуре, вы можете удерживать нажатой Ctrlиконку на панели задач интересующего вас приложения. Каждый раз, когда вы делаете это, появляется другое окно, принадлежащее этому приложению. выйти на первый план.

Кроме того, программа VistaSwitcher устанавливает Win+ F11и Alt+ `для переключения между окнами текущего приложения. (Кстати, на его веб-сайте написано, что Windows 8 не поддерживается, но мне повезло с ней под 8.1; единственная проблема, которую я видел до сих пор, - это то, что иногда она отображает такие вещи, как боковая панель поиска как открытые окна. что, но YMMV.)

echristopherson
источник
2
ОГРОМНОЕ улучшение качества жизни. Хотя выделенная горячая клавиша была бы более идеальной, решение WIN + # серьезно ограничено количеством клавиш, плохой эргономикой и ужасной задержкой, не говоря уже о создании конфликта между доступными горячими клавишами (1-4) и желаемым расположением панели запуска.
bpcookson
1
VistaSwitcher красивый. Спасибо за предложение.
Дастин Опря
Вы также можете добавить элементы в список исключений, такие как «Новое уведомление» и «Кортана» в Windows 10.
dragon788
1
Я люблю программу Vista 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. Работает отлично!

Eras

Seperman
источник
2
Это прекрасно работает с некоторыми оговорками: 1) Для Chrome он будет циклически повторять все подобные Chrome окна, включая такие приложения, как Slack! 2) Для современных приложений - и если у вас открыто только одно окно современного приложения - оно откроет случайное другое современное приложение (т. Е. Если у вас открыт Календарь и это единственное современное приложение, оно откроет «Настройки», или «Спорт», или «Почта» и т. д.)
Кирк Волл
@KirkWoll Это верно. Определенно, есть место для его улучшения. У меня не было времени по-настоящему покопаться в Autohotkey, чтобы это произошло ...
Сеперман,
Отличная работа, использовал ее сразу, спасибо. Несколько моментов: WinGet, Listвозвращает количество окон в Listпеременной (в отличие от List%n%псевдосетки, в которой хранятся дескрипторы), поэтому вы можете пропустить WinGet, WinClassCountвызов и проверить Listвместо этого. Кроме того, код кажется одинаковым для обеих горячих клавиш.
Лебенита
это не работает со мной в Windows 10 64bit и Microsoft Office 2016. Вы можете помочь?
Люк
1
Это работает хорошо, однако, кажется, переключается между ВСЕМИ окнами независимо от рабочего стола. Я широко использую вид задач и мне нужно прыгать через окна только на одном рабочем столе.
Петр
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, так как это модификатор для возврата назад с несколькими другими сочетаниями клавиш. Я люблю автогонки.

user332861
источник
1
Круто. Я обновил свой код на основе вашего, а также отзывов, которые я получил на форуме Autohotkey. Новый код не будет проходить по свернутым окнам так же, как в Mac.
Сеперман
@Seperman, что если я захочу пройти через свернутые окна? Что я должен изменить в вашем сценарии, чтобы сделать это.
Ghos3t
Это работает хорошо, за исключением того, что оно не будет работать правильно с приложениями на основе Chrome или Chrome / Electron (такими как 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) в обратном направлении.)
Скотт
5

Easy Windows Switcher от Neosmart делает именно то, что вам нужно.

Вот описание от Easy Windows , Switcher веб - сайта

Easy Window Switcher делает переключение между различными окнами таким же простым, как alt+`(это alt + backtick), как на Mac. Забудьте о том, что вам нужно alt+tabмежду миллионами и одним открытым окном, чтобы найти то, что вы ищете, с помощью Easy Window Switcher вкладывание между окнами одной и той же программы - всего лишь alt+`шаг.

Ishan
источник
1
не "всегда" работает. Если я какое-то время работаю над другим приложением, то возвращайтесь, оно перестает работать.
Dushyant Bangal
4

VistaSwitcher позволяет или для этой функции. Он совместим с Windows 10 (хотя название предполагает иное). На Windows 8 и выше, я предлагаю добавить определенные приложения метро в список исключений.

Верхний ответ - хороший, но он не работает на настройках нескольких мониторов, где на панели задач установлено отображение только значков на активном мониторе.

Янак Мина
источник
Win + n работает в моей системе W7 с несколькими экранами, и панель задач отображается только на главном мониторе - это то, что вы имели в виду, или есть ли способ заставить панель задач переключиться на текущий активный монитор (который, я думаю, будет отвлекать) ?
Лебенита
1

В дополнение к тому, что Скотт ( https://superuser.com/users/150988/scott ) поделился:

ctrl+ repeatedly click над значком приложения на панели задач также сделает работу.

Нестор Уолдид
источник
1
(этот ответ уже дан другим пользователем)
Пит Элвин
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 для переключения между окнами и того же приложения, что работа с регулярным окна приложения , Chrome ярлыков и приложений Chrome .

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 и т. Д. (В редких случаях он не работал правильно в некоторых приложениях, таких как Mintty / Cygwin, gVim, а иногда и на Powershell, если название окон изменилось)
выдра. Про
0

Я создал скрипт AutoHotkey, который прекрасно интегрируется с Windows Task Switcher ( Alt+ Tab), предоставляя все его преимущества: предварительный просмотр окон приложения, щелчок для выбора, навигация по клавишам со стрелками, активация только одного нужного окна. Вызывайте / перемещайтесь с помощью Alt+ `и Alt+ Shift+ `(backtick), чтобы переключаться между окнами, имеющими то же имя процесса, что и текущее окно. Я считаю, что это более удобно, чем « Win+», так numкак оно работает для любого приложения (вместо того, чтобы запоминать номер закрепленного слота), окна предварительного просмотра больше, фон не размыт, и он плавно смешивается с Alt+ Tabнавигацией. Проверено на Windows 10.

Основная хитрость заключается в том, чтобы временно скрывать окна нецелевых приложений от переключателя задач путем установки WS_EX_TOOLWINDOWи отмены настройки WS_EX_APPWINDOW. Чтобы установить эти стили окон в окнах, работающих от имени администратора, AutoHotkey должен быть подписан или запущен от имени администратора . Я следовал очень простым инструкциям по подписанию здесь .

Некоторые связанные темы, которые внесли свой вклад:

!`::
{
   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_
}

KrisG
источник
К сожалению, наши правки пересеклись. Я попытался снова собрать Шалтай-Болтай; пожалуйста, проверьте, что ваш код соответствует вашим ожиданиям.
Скотт
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
otter.pro
источник
0
!`::
#`::
WinGet, ExeName, ProcessName, A
WinActivateBottom, ahk_exe %ExeName%
return

Упрощено от ответа @ otter.pro. Это просто циклически перебирает текущие окна приложения. Повторное движение вперед может вызвать кратковременное мигание других окон. Поскольку не видеть вспышки, вероятно, более важно, чем двунаправленный цикл, просто не двигайтесь вперед. Кроме того, этот ответ допускает # `в качестве альтернативы!`, Так как это комбинация клавиш для ярлыка Mac.

cjfp
источник