이 스크립트는 여러분이 선택한 핫키를 창을 감추는 데 할당합니다. 창은 스크립트의 트레이 메뉴 아래에 엔트리가 됩니다. 숨은 창들은 개별적으로 또는 한 꺼번에 메뉴에서 상응하는 항목을 선택해 보여줄 수 있습니다. 스크립트가 어떤 이유로 종료하면, 숨겨진 모든 창은 자동으로 숨김 해제됩니다.
이 스크립트 내려받기 | 다른 샘플 스크립트 | 홈으로
; 변경 이력:
; 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