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


38

Чи є ярлик у Windows 7 для перемикання між вікнами лише в заданій програмі? Мені дуже подобається ця функція в OS X; який його еквівалент у Windows?



<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запустить її. 

  • Але, якщо натиснути і утримувати іShift, з самого початку, а потім набратиn, Windows запустить новий екземпляр (або принаймні нове вікно) цього додатка, навіть якщо він вже працює.   (Це не вдасться для деяких програм, наприклад Windows Media Player, які не дозволяють одночасно запускати кілька вікон.)
  • +, nздається, не працює з цифровою клавіатурою.

1
Це, здається, не працює на багатоекранних налаштуваннях, де ви розширюєте панель завдань
Ерфан

1
Чудово. І Win + Shift + 1 проходить цикли через вікна назад.
TranslucentCloud

24

У Windows 7 і 8, хоча немає ярлика, який я знаю, доступного лише з клавіатури, ви можете утримувати Ctrl, натискаючи значок панелі завдань цікавого додатка. Кожен раз, коли ви це зробите, інше вікно, що належить цьому додатку, буде вийти на перший план.

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


2
ВЕЛИЧЕЗНА покращення якості життя. Хоча спеціальна гаряча клавіша була б більш ідеальною, рішення WIN + # суворо обмежено кількістю клавіш, поганою ергономікою та жахливою затримкою, не кажучи вже про створення конфлікту між доступними гарячими клавішами (1-4) та бажаним місцем запуску смуги.
bpcookson

1
VistaSwitcher прекрасна. Дякую за пропозицію.
Дастін Опреа

Ви також можете додати елементи до списку виключень, як-от "Нове сповіщення" та "Кортана" в Windows 10.
dragon788

1
Я люблю програму перемикача Vista.
Лука

1
схоже, що спадкоємець vistaswitcher, який названий, alt-tab terminatorбільше не має функції вкладки між одним і тим же додатком
starcorn

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

Для мене це дуже добре працює. Використовуючи функцію автоматичної клавіші, я також зробив свої копії / вставки / скасування, ... клавіші, як Mac. Чудово працює!

Ера


2
Це чудово працює з деякими застереженнями: 1) Для Chrome він запускатиме всі вікна, схожі на Chrome, включаючи додатки, такі як Slack! 2) Для сучасних додатків - і якщо у вас відкрито лише одне вікно сучасного додатка - воно відкриє випадкове інше сучасне додаток (тобто, якщо у вас відкритий Календар, і це єдиний сучасний додаток, він відкриє "Налаштування", або "Спорт", або "Пошта" тощо)
Кірк Волл

@KirkWoll Правильно. Однозначно є можливість її покращити. У мене не було часу по-справжньому копатися в Autohotkey, щоб це сталося ...
Seperman

Чудова робота, використали її одразу, дякую. Кілька пунктів: WinGet, Listповертає кількість вікон у Listзмінній (на відміну від List%n%псевдомарину, в якому зберігаються ручки), тож ви можете пропустити WinGet, WinClassCountвиклик і перевірити його List. Також код здається однаковим для обох гарячих клавіш.
Лебеніта

це не працює зі мною в Windows 10 64bit і Microsoft Office 2016. Чи можете ви допомогти?
Лука

1
Це добре працює, однак, схоже, перемикається між ВСІМ вікнами незалежно від робочого столу. Я широко використовую перегляд завдань і мені потрібно стрибати через вікна лише на одному робочому столі.
Петро

8

Дякую, Erasmose, але твоя версія сценарію автоматичної клавіші зменшить вікно, якщо немає інших вікон цього типу. Іноді ви цього не знаєте, а мінімізація - це дратівливий спосіб дізнатися, тому я змінив ваш сценарій так:

!`::    ; 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, що робити, якщо я хочу провести цикл через мінімізовані вікна. Що я повинен змінити у вашому сценарії, щоб це зробити.
Ghos3t

Це добре працює, за винятком того, що він не буде поводитись належним чином із додатками на базі Chrome або Chrome / Electron (як VS Code та Slack), оскільки він проходить через усі вони.
otter.pro

Замість того, щоб використовувати ім'я класу вікон, я використовував ім'я процесу, щоб добре грати з додатками на базі Electron та Firefox / Thunderbird. Сценарій на gist.github.com/snmishra/794c5f41693510c46ba9bedc839696a8
Satya Mishra

7

Деякі програми, що реалізують MDI, надають Ctrl + Tab для перемикання між "Документами" під одним і тим же екземпляром програми. наприклад, MS Office. Але це не функція Windows, і це залежить від програми. Для іншого програмного забезпечення існують різні скорочення. наприклад, Firefox не забезпечує цю функцію, але є доповнення, яке додає функціональність.

Окрім того, ось список комбінацій клавіш у вікнах.

Також існують дискусії про скорочення клавіш у Windows.

Сподіваюся, що це допомагає.


2
Також деякі програми використовують для цього (Ctrl) + (F6). (Додати (Shift) у зворотному напрямку.)
Скотт

5

Легкий перемикач Windows від Neosmart робить саме те, що вам потрібно.

Ось опис веб-сайту Easy Windows Switcher

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


1
не працює "завжди". Якщо я працюю над іншим додатком деякий час, то поверніться, він перестане працювати.
Dushyant Bangal

4

VistaSwitcher дозволяє або використовувати цю функцію. Він сумісний з Windows 10 (хоча назва говорить про інше). В ОС Windows 8 і новіших версій я пропоную додати певні програми метро до списку виключень.

Верхня відповідь хороша, але вона не працює в налаштуваннях на декількох моніторах, де на панелі завдань показано лише піктограми на активному моніторі.


Win + n працює в моїй системі W7 з декількома екранами та панеллю завдань, яка відображається лише на головному моніторі - це те, що ви мали на увазі, чи є дійсно спосіб переключити панель завдань на активний монітор (який, на мою думку, буде відволікати) ?
Лебеніта


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 repo є ще один сценарій 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, якщо назва Windows змінилася)
видра. pro

0

Я створив сценарій AutoHotkey, який чудово інтегрується з перемикачем завдань Windows ( Alt+ Tab), надаючи всі його переваги: ​​попередній перегляд вікон додатків, натисніть, щоб вибрати, навігація зі стрілками, активуйте лише одне вікно, яке ви хочете. Викликати / переходити з Alt+ `та Alt+ Shift+ `(backtick) для переходу між вікнами, що мають таку ж назву процесу, що і поточне вікно. Я вважаю це більш корисним, ніж Win+, numоскільки воно працює для будь-якого додатка (замість того, щоб запам'ятовувати зафіксований номер слота), попередній перегляд вікон більший, фон не розмивається, і він плавно змішується з Alt+ Tabнавігацією. Тестовано на Windows 10.

Основна хитрість - тимчасово приховати нецільові вікна програм від перемикача завдань, встановивши WS_EX_TOOLWINDOWта вимкнувши WS_EX_APPWINDOW. Для того, щоб встановити ці стилі Windows на Windows, які працюють як адміністратор, 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_
}


На жаль; наші зміни перекреслилися. Я спробував знову згорнути Humpty Dumpty; будь ласка, перевірте, чи є ваш код таким, яким ви його мали намір.
Скотт

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.