창을 트레이 메뉴로 최소화하기
이 스크립트는 여러분이 선택한 핫키를 창을 감추는 데 할당합니다. 창은 스크립트의 트레이 메뉴 아래에 엔트리가 됩니다. 숨은 창들은 개별적으로 또는 한 꺼번에 메뉴에서 상응하는 항목을 선택해 보여줄 수 있습니다. 스크립트가 어떤 이유로 종료하면, 숨겨진 모든 창은 자동으로 숨김 해제됩니다.
이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로
; 변경 이력: ; July 22, 2005 (egilmour가 제공한 변경): ; - 마지막 숨은 창을 보여줄 새 핫키 추가 (Win+U) ; ; November 3, 2004 (trogdor가 제공한 변경): ; - 프로그램 관리자가 숨지 못하도록 방지. ; - 활성 창이 없다면, minimize-to-tray 핫키가 무한정 기다리는 대신에 ; 아무 효과가 없도록 변경. ; ; October 23, 2004: ; - 태스크바가 숨지 못하도록 방지. ; - 창 제목이 긴경우 발생 가능한 문제들이 해결됨. ; - 제목 없는 창도 아무 문제 없이 숨길 수 있음. ; - 스크립트가 AHK v1.0.22 이상에서 실행 중이면, ; 각 메뉴 항목의 최대 길이을 100에서 260으로 늘림. ; CONFIGURATION SECTION: 아래의 값을 입맛에 맞게 바꾸십시오. ; 다음은 숨기기를 허용할 창의 최대 개수입니다. ; (제한을 두면 수행성능이 향상됩니다): mwt_MaxWindows = 50 ; 활성 창을 감추는데 사용되는 핫키입니다: mwt_Hotkey = #h ; Win+H ; 마지막 숨김 창을 보여주는 데 사용되는 핫키입니다: mwt_UnHotkey = #u ; Win+U ; 트레이 메뉴에서 모든 표준 항목을 비우려면, ; 예를 들어 Help 그리고 Pause를 비우려면, N을 사용하십시오. 그렇지 않으면, Y를 사용하십시오: mwt_StandardMenu = N ; 다음의 몇 가지 수행성능을 위한 설정은 ; #HotkeyModifierTimeout 시간 안에 조치를 마치는 데 도움이 됩니다. ; 그리하여 주욱 늘어선 여러 창을 일렬로 감추기 위해 ; 핫키의 수식자를 떼고 누를 필요가 없습니다. ; 다음과 같이 설정하면 #InstallKeybdHook 또는 기타 수단을 통하여 ; 스크립트에 키보드 갈고리를 사용할 필요가 없습니다: #HotkeyModifierTimeout 100 SetWinDelay 10 SetKeyDelay 0 #SingleInstance ; 이 스크립트의 실체가 하나만 실행되도록 허용합니다. ; END OF CONFIGURATION SECTION (이 시점부터 변경하지 마십시오 ; 단, 스크립트의 기본 기능을 변경하고 싶은 경우는 예외입니다). Hotkey, %mwt_Hotkey%, mwt_Minimize Hotkey, %mwt_UnHotkey%, mwt_UnMinimize ; 사용자가 어떤 수단으로 스크립트를 종료하면, ; 모든 창을 먼저 닫습니다: OnExit, mwt_RestoreAllThenExit if mwt_StandardMenu = Y Menu, Tray, Add else { Menu, Tray, NoStandard Menu, Tray, Add, E&xit and Unhide All, mwt_RestoreAllThenExit } Menu, Tray, Add, &Unhide All Hidden Windows, mwt_RestoreAll Menu, Tray, Add ; 위 항목을 더 특별하게 만들어 줄 또다른 가름 줄. if a_AhkVersion = ; 비어 있으므로, 버전이 1.0.22 미만입니다. mwt_MaxLength = 100 else mwt_MaxLength = 260 ; 이를 줄이면 메뉴의 너비를 제한할 수 있습니다. return ; 자동 실행 섹션의 끝. mwt_Minimize: if mwt_WindowCount >= %mwt_MaxWindows% { MsgBox No more than %mwt_MaxWindows% may be hidden simultaneously. return } ; "마지막으로 발견된 창"을 설정해 수행성능을 개선하고 일을 간단하게 만듭니다. ; 어떤 경우 활성 창이 없을 수 있으므로, ; 시간제한을 추가했습니다: WinWait, A,, 2 if ErrorLevel <> 0 ; 시한 종료, 그래서 아무것도 하지 않습니다. return ; 그렇지 않으면, "마지막 발견 창"을 설정하고 이제 사용할 수 있습니다: WinGet, mwt_ActiveID, ID WinGetTitle, mwt_ActiveTitle WinGetClass, mwt_ActiveClass if mwt_ActiveClass in Shell_TrayWnd,Progman { MsgBox The desktop and taskbar cannot be hidden. return } ; 창을 감추어도 비활성화되는 것은 아니기 때문에, ; 이 창 아래의 창을 활성화 합니다. 다른 방법을 시도했지만, 결과적으로 ; 태스크 바가 활성화되었습니다. 이런 식으로 (숨기 바로 직전의) 활성 창을 ; 스택 뒤로 밀어 버리는 편이 가장 좋은 듯 보입니다: Send, !{esc} ; Hide it only now that WinGetTitle/WinGetClass above have been run ; (기본적으로, 그런 명령어들은 숨은 창을 탐지할 수 없기 때문입니다): WinHide ; 제목이 비어 있으면, 대신에 클래스를 사용하십시오. 이것은 두 가지 목적으로 기여합니다: ; 1) 더 의미 있는 이름이 메뉴 이름으로 사용됩니다. ; 2) 메뉴 항목을 생성할 수 있습니다 ; (그렇지 않으면, 빈 항목을 아래의 다양한 루틴에서 제대로 다룰 수 없습니다). if mwt_ActiveTitle = mwt_ActiveTitle = ahk_class %mwt_ActiveClass% ; 제목이 길이가 짧은지 확인합니다. ; mwt_ActiveTitle도 역시 이 특정한 메뉴 항목을 유일하게 식별하는 데 기여합니다. StringLeft, mwt_ActiveTitle, mwt_ActiveTitle, %mwt_MaxLength% ; 트레이 메뉴가 각 메뉴 이름이 유일하기를 요구하는 외에도 ; 메뉴 이름이 유일해야만 나중에 창이 숨을 때 ; 배열에서 안전하게 찾을 수 있습니다. ; 그래서 아직 그렇지 않다면 유일하게 만드십시오: Loop, %mwt_MaxWindows% { if mwt_WindowTitle%a_index% = %mwt_ActiveTitle% { ; 부합이 발견됨. 그래서 유일한 것이 아닙니다. ; 먼저 0x를 십육진 수에서 제거해 메뉴 공간을 보존합니다: StringTrimLeft, mwt_ActiveIDShort, mwt_ActiveID, 2 StringLen, mwt_ActiveIDShortLength, mwt_ActiveIDShort StringLen, mwt_ActiveTitleLength, mwt_ActiveTitle mwt_ActiveTitleLength += %mwt_ActiveIDShortLength% mwt_ActiveTitleLength += 1 ; +1 the 1 space between title & ID. if mwt_ActiveTitleLength > %mwt_MaxLength% { ; 메뉴 이름이 길이에 제한이 있기 때문에, ; 제목을 다듬어 그의 이름 뒤에 ; 창의 Short ID를 위한 충분한 공간을 확보합니다: TrimCount = %mwt_ActiveTitleLength% TrimCount -= %mwt_MaxLength% StringTrimRight, mwt_ActiveTitle, mwt_ActiveTitle, %TrimCount% } ; 유일한 제목을 빌드합니다: mwt_ActiveTitle = %mwt_ActiveTitle% %mwt_ActiveIDShort% break } } ; 먼저, 이 ID가 리스트에 이미 존재하지 않는지 확인합니다. ; 이런 일은 특정 창이 외부적으로 보이게 되면 (또는 그의 어플리케이션이 숨김을 해제하면 ; 일어날 수 있습니다. 그리고 이제 다시 숨기 일보 직전입니다: mwt_AlreadyExists = n Loop, %mwt_MaxWindows% { if mwt_WindowID%a_index% = %mwt_ActiveID% { mwt_AlreadyExists = y break } } ; 항목을 트레이와 메뉴에 추가합니다: if mwt_AlreadyExists = n { Menu, Tray, add, %mwt_ActiveTitle%, RestoreFromTrayMenu mwt_WindowCount += 1 Loop, %mwt_MaxWindows% ; Search for a free slot. { ; 올바르게 설계되었다면 언제나 빈 공간을 찾을 수 있을 것입니다. if mwt_WindowID%a_index% = ; 빈 슬롯이 발견되었습니다. { mwt_WindowID%a_index% = %mwt_ActiveID% mwt_WindowTitle%a_index% = %mwt_ActiveTitle% break } } } return RestoreFromTrayMenu: Menu, Tray, delete, %A_ThisMenuItem% ; 메뉴 항목 이름으로 저장된 유일한 제목에 기반하여 창을 찾습니다: Loop, %mwt_MaxWindows% { if mwt_WindowTitle%a_index% = %A_ThisMenuItem% ; 부합 발견. { StringTrimRight, IDToRestore, mwt_WindowID%a_index%, 0 WinShow, ahk_id %IDToRestore% WinActivate ahk_id %IDToRestore% ; 종종 필요. mwt_WindowID%a_index% = ; 비워서 슬롯을 풀어줍니다. mwt_WindowTitle%a_index% = mwt_WindowCount -= 1 break } } return ;; 다음은 마지막 최소화 창을 스택에서 꺼내 보여줍니다. mwt_UnMinimize: ;; 더 이상 보여줄 것이 없는지 확인합니다. if mwt_WindowCount > 0 { ;; 마지막 최소 창의 id를 얻어 그것을 보여줍니다 StringTrimRight, IDToRestore, mwt_WindowID%mwt_WindowCount%, 0 WinShow, ahk_id %IDToRestore% WinActivate ahk_id %IDToRestore% ;; 마지막 최소 창의 메뉴 이름을 얻어 그것을 제거합니다 StringTrimRight, MenuToRemove, mwt_WindowTitle%mwt_WindowCount%, 0 Menu, Tray, delete, %MenuToRemove% ;; 우리의 '배열'을 정리하고 창 개수를 줄입니다 mwt_WindowID%mwt_WindowCount% = mwt_WindowTitle%mwt_WindowCount% = mwt_WindowCount -= 1 } return mwt_RestoreAllThenExit: Gosub, mwt_RestoreAll ExitApp ; 진짜로 종료합니다. mwt_RestoreAll: Loop, %mwt_MaxWindows% { if mwt_WindowID%a_index% <> { StringTrimRight, IDToRestore, mwt_WindowID%a_index%, 0 WinShow, ahk_id %IDToRestore% WinActivate ahk_id %IDToRestore% ; 종종 필요함. ; 이런 식으로 하거나 vs. 모두 지웁니다(DeleteAll) ; 가름 줄과 첫 항목은 그대로 둡니다: StringTrimRight, MenuToRemove, mwt_WindowTitle%a_index%, 0 Menu, Tray, delete, %MenuToRemove% mwt_WindowID%a_index% = ; 비워서 슬롯을 풀어 줍니다. mwt_WindowTitle%a_index% = mwt_WindowCount -= 1 } if mwt_WindowCount = 0 break } return