Below is a version of keyboardfreak's popular Incrementally Switch Windows script, with some minor code changes (clearly marked in the script) which lead to some major changes in appearance.
* Window has no border
* Font is much larger
* Window is semi-transparent
* No textbox
* No text labels
* No title bar
* See only what you need
I am posting it here because the original thread is huge already, and because this is actually a sub-version and not the original
Screenshot (Google in the background):
![Posted Image](http://img376.imageshack.us/img376/9753/iswitchshotzj7.th.png)
; ; iswitchw - Incrementally switch between windows using substrings ; ; [MODIFIED by ezuk, 3 July 2008, changes noted below. Cosmetics only.] ; ; Required AutoHotkey version: 1.0.25+ ; ; When this script is triggered via its hotkey the list of titles of ; all visible windows appears. The list can be narrowed quickly to a ; particular window by typing a substring of a window title. ; ; When the list is narrowed the desired window can be selected using ; the cursor keys and Enter. If the substring matches exactly one ; window that window is activated immediately (configurable, see the ; "autoactivateifonlyone" variable). ; ; The window selection can be cancelled with Esc. ; ; The switcher window can be moved horizontally with the left/right ; arrow keys if it blocks the view of windows under it. ; ; The switcher can also be operated with the mouse, although it is ; meant to be used from the keyboard. A mouse click activates the ; currently selected window. Mouse users may want to change the ; activation key to one of the mouse keys. ; ; If enabled possible completions are offered when the same unique ; substring is found in the title of more than one window. ; ; For example, the user typed the string "co" and the list is ; narrowed to two windows: "Windows Commander" and "Command Prompt". ; In this case the "command" substring can be completed automatically, ; so the script offers this completion in square brackets which the ; user can accept with the TAB key: ; ; co[mmand] ; ; This feature can be confusing for novice users, so it is disabled ; by default. ; ; ; For the idea of this script the credit goes to the creators of the ; iswitchb package for the Emacs editor ; ; ;---------------------------------------------------------------------- ; ; User configuration ; ; set this to yes if you want to select the only matching window ; automatically autoactivateifonlyone = ; set this to yes if you want to enable tab completion (see above) ; it has no effect if firstlettermatch (see below) is enabled tabcompletion = ; set this to yes to enable digit shortcuts when there are ten or ; less items in the list digitshortcuts = ; set this to yes to enable first letter match mode where the typed ; search string must match the first letter of words in the ; window title (only alphanumeric characters are taken into account) ; ; For example, the search string "ad" matches both of these titles: ; ; AutoHotkey - Documentation ; Anne's Diary ; firstlettermatch = ; set this to yes to enable activating the currently selected ; window in the background activateselectioninbg = ; number of milliseconds to wait for the user become idle, before ; activating the currently selected window in the background ; ; it has no effect if activateselectioninbg is off ; ; if set to blank the current selection is activated immediately ; without delay bgactivationdelay = 300 ; show process name before window title. showprocessname = ; Close switcher window if the user activates an other window. ; It does not work well if activateselectioninbg is enabled, so ; currently they cannot be enabled together. closeifinactivated = if activateselectioninbg <> if closeifinactivated <> { msgbox, activateselectioninbg and closeifinactivated cannot be enabled together exitapp } ; List of subtsrings separated with pipe (|) characters (e.g. carpe|diem). ; Window titles containing any of the listed substrings are filtered out ; from the list of windows. filterlist = asticky|blackbox ; Set this yes to update the list of windows every time the contents of the ; listbox is updated. This is usually not necessary and it is an overhead which ; slows down the update of the listbox, so this feature is disabled by default. dynamicwindowlist = ; path to sound file played when the user types a substring which ; does not match any of the windows ; ; set this to blank if you don't want a sound ; nomatchsound = %windir%\Media\ding.wav if nomatchsound <> ifnotexist, %nomatchsound% msgbox, Sound file %nomatchsound% not found. No sound will be played. ;---------------------------------------------------------------------- ; ; Global variables ; ; numallwin - the number of windows on the desktop ; allwinarray - array containing the titles of windows on the desktop ; dynamicwindowlist is disabled ; allwinidarray - window ids corresponding to the titles in allwinarray ; numwin - the number of windows in the listbox ; idarray - array containing window ids for the listbox items ; orig_active_id - the window ID of the originally active window ; (when the switcher is activated) ; prev_active_id - the window ID of the last window activated in the ; background (only if activateselectioninbg is enabled) ; switcher_id - the window ID of the switcher window ; filters - array of filters for filtering out titles ; from the window list ; ;---------------------------------------------------------------------- AutoTrim, off ;this section modified by ezuk, 03 July 2008 Gui, +LastFound +AlwaysOnTop -Caption Gui, Color, black,black WinSet, Transparent, 180 Gui,Font,s30 cYellow bold,Calibri Gui, Add, ListBox, vindex gListBoxClick x-2 y-2 w810 h602 AltSubmit -VScroll ;end of modifications by ezuk if filterlist <> { loop, parse, filterlist, | { filters%a_index% = %A_LoopField% } } ;---------------------------------------------------------------------- ; ; I never use the CapsLock key, that's why I chose it. ; CapsLock:: search = numallwin = 0 GuiControl,, Edit1 GoSub, RefreshWindowList WinGet, orig_active_id, ID, A prev_active_id = %orig_active_id% Gui, Show, Center h600 w800, Window Switcher ; If we determine the ID of the switcher window here then ; why doesn't it appear in the window list when the script is ; run the first time? (Note that RefreshWindowList has already ; been called above). ; Answer: Because when this code runs first the switcher window ; does not exist yet when RefreshWindowList is called. WinGet, switcher_id, ID, A WinSet, AlwaysOnTop, On, ahk_id %switcher_id% Loop { if closeifinactivated <> settimer, CloseIfInactive, 200 Input, input, L1, {enter}{esc}{backspace}{up}{down}{pgup}{pgdn}{tab}{left}{right} if closeifinactivated <> settimer, CloseIfInactive, off if ErrorLevel = EndKey:enter { GoSub, ActivateWindow break } if ErrorLevel = EndKey:escape { Gui, cancel ; restore the originally active window if ; activateselectioninbg is enabled if activateselectioninbg <> WinActivate, ahk_id %orig_active_id% break } if ErrorLevel = EndKey:backspace { GoSub, DeleteSearchChar continue } if ErrorLevel = EndKey:tab if completion = continue else input = %completion% ; pass these keys to the selector window if ErrorLevel = EndKey:up { Send, {up} GoSuB ActivateWindowInBackgroundIfEnabled continue } if ErrorLevel = EndKey:down { Send, {down} GoSuB ActivateWindowInBackgroundIfEnabled continue } if ErrorLevel = EndKey:pgup { Send, {pgup} GoSuB ActivateWindowInBackgroundIfEnabled continue } if ErrorLevel = EndKey:pgdn { Send, {pgdn} GoSuB ActivateWindowInBackgroundIfEnabled continue } if ErrorLevel = EndKey:left { direction = -1 GoSuB MoveSwitcher continue } if ErrorLevel = EndKey:right { direction = 1 GoSuB MoveSwitcher continue } ; FIXME: probably other error level cases ; should be handled here (interruption?) ; invoke digit shortcuts if applicable if digitshortcuts <> if numwin <= 10 if input in 1,2,3,4,5,6,7,8,9,0 { if input = 0 input = 10 if numwin < %input% { if nomatchsound <> SoundPlay, %nomatchsound% continue } GuiControl, choose, ListBox1, %input% GoSub, ActivateWindow break } ; process typed character search = %search%%input% GuiControl,, Edit1, %search% GoSub, RefreshWindowList } Gosub, CleanExit return ;---------------------------------------------------------------------- ; ; Refresh the list of windows according to the search criteria ; ; Sets: numwin - see the documentation of global variables ; idarray - see the documentation of global variables ; RefreshWindowList: ; refresh the list of windows if necessary if ( dynamicwindowlist = "yes" or numallwin = 0 ) { numallwin = 0 WinGet, id, list, , , Program Manager Loop, %id% { StringTrimRight, this_id, id%a_index%, 0 WinGetTitle, title, ahk_id %this_id% ; FIXME: windows with empty titles? if title = continue ; don't add the switcher window if switcher_id = %this_id% continue ; show process name if enabled if showprocessname <> { WinGet, procname, ProcessName, ahk_id %this_id% stringgetpos, pos, procname, . if ErrorLevel <> 1 { stringleft, procname, procname, %pos% } stringupper, procname, procname title = %procname%: %title% } ; don't add titles which match any of the filters if filterlist <> { filtered = loop { stringtrimright, filter, filters%a_index%, 0 if filter = break else ifinstring, title, %filter% { filtered = yes break } } if filtered = yes continue } ; replace pipe (|) characters in the window title, ; because Gui Add uses it for separating listbox items StringReplace, title, title, |, -, all numallwin += 1 allwinarray%numallwin% = %title% allwinidarray%numallwin% = %this_id% } } ; filter the window list according to the search criteria winlist = numwin = 0 Loop, %numallwin% { StringTrimRight, title, allwinarray%a_index%, 0 StringTrimRight, this_id, allwinidarray%a_index%, 0 ; don't add the windows not matching the search string ; if there is a search string if search <> if firstlettermatch = { if title not contains %search%, continue } else { stringlen, search_len, search index = 1 match = loop, parse, title, %A_Space% { stringleft, first_letter, A_LoopField, 1 ; only words beginning with an alphanumeric ; character are taken into account if first_letter not in 1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z continue stringmid, search_char, search, %index%, 1 if first_letter <> %search_char% break index += 1 ; no more search characters if index > %search_len% { match = yes break } } if match = continue ; no match } if winlist <> winlist = %winlist%| winlist = %winlist%%title%`r%this_id% numwin += 1 winarray%numwin% = %title% } ; if the pattern didn't match any window if numwin = 0 ; if the search string is empty then we can't do much if search = { Gui, cancel Gosub, CleanExit } ; delete the last character else { if nomatchsound <> SoundPlay, %nomatchsound% GoSub, DeleteSearchChar return } ; sort the list alphabetically Sort, winlist, D| ; add digit shortcuts if there are ten or less windows ; in the list and digit shortcuts are enabled if digitshortcuts <> if numwin <= 10 { digitlist = digit = 1 loop, parse, winlist, | { ; FIXME: windows with empty title? if A_LoopField <> { if digitlist <> digitlist = %digitlist%| digitlist = %digitlist%%digit%%A_Space%%A_Space%%A_Space%%A_LoopField% digit += 1 if digit = 10 digit = 0 } } winlist = %digitlist% } ; strip window IDs from the sorted list titlelist = arrayindex = 1 loop, parse, winlist, | { stringgetpos, pos, A_LoopField, `r stringleft, title, A_LoopField, %pos% titlelist = %titlelist%|%title% pos += 2 ; skip the separator char stringmid, id, A_LoopField, %pos%, 10000 idarray%arrayindex% = %id% ++arrayindex } ; show the list GuiControl,, ListBox1, %titlelist% GuiControl, Choose, ListBox1, 1 if numwin = 1 if autoactivateifonlyone <> { GoSub, ActivateWindow Gosub, CleanExit } GoSub ActivateWindowInBackgroundIfEnabled completion = if tabcompletion = return ; completion is not implemented for first letter match mode if firstlettermatch <> return ; determine possible completion if there is ; a search string and there are more than one ; window in the list if search = return if numwin = 1 return loop { nextchar = loop, %numwin% { stringtrimleft, title, winarray%a_index%, 0 if nextchar = { substr = %search%%completion% stringlen, substr_len, substr stringgetpos, pos, title, %substr% if pos = -1 break pos += %substr_len% ; if the substring matches the end of the ; string then no more characters can be completed stringlen, title_len, title if pos >= %title_len% { pos = -1 break } ; stringmid has different position semantics ; than stringgetpos. strange... pos += 1 stringmid, nextchar, title, %pos%, 1 substr = %substr%%nextchar% } else { stringgetpos, pos, title, %substr% if pos = -1 break } } if pos = -1 break else completion = %completion%%nextchar% } if completion <> GuiControl,, Edit1, %search%[%completion%] return ;---------------------------------------------------------------------- ; ; Delete last search char and update the window list ; DeleteSearchChar: if search = return StringTrimRight, search, search, 1 GuiControl,, Edit1, %search% GoSub, RefreshWindowList return ;---------------------------------------------------------------------- ; ; Activate selected window ; ActivateWindow: Gui, submit stringtrimleft, window_id, idarray%index%, 0 WinActivate, ahk_id %window_id% return ;---------------------------------------------------------------------- ; ; Activate selected window in the background ; ActivateWindowInBackground: guicontrolget, index,, ListBox1 stringtrimleft, window_id, idarray%index%, 0 if prev_active_id <> %window_id% { WinActivate, ahk_id %window_id% WinActivate, ahk_id %switcher_id% prev_active_id = %window_id% } return ;---------------------------------------------------------------------- ; ; Activate selected window in the background if the option is enabled. ; If an activation delay is set then a timer is started instead of ; activating the window immediately. ; ActivateWindowInBackgroundIfEnabled: if activateselectioninbg = return ; Don't do it just after the switcher is activated. It is confusing ; if active window is changed immediately. WinGet, id, ID, ahk_id %switcher_id% if id = return if bgactivationdelay = GoSub ActivateWindowInBackground else settimer, BgActivationTimer, %bgactivationdelay% return ;---------------------------------------------------------------------- ; ; Check if the user is idle and if so activate the currently selected ; window in the background ; BgActivationTimer: settimer, BgActivationTimer, off GoSub ActivateWindowInBackground return ;---------------------------------------------------------------------- ; ; Stop background window activation timer if necessary and exit ; CleanExit: settimer, BgActivationTimer, off exit ;---------------------------------------------------------------------- ; ; Cancel keyboard input if GUI is closed. ; GuiClose: send, {esc} return ;---------------------------------------------------------------------- ; ; Handle mouse click events on the list box ; ListBoxClick: if (A_GuiControlEvent = "Normal" and !GetKeyState("Down", "P") and !GetKeyState("Up", "P")) send, {enter} return ;---------------------------------------------------------------------- ; ; Move switcher window horizontally ; ; Input: direction - 1 for right, -1 for left ; MoveSwitcher: direction *= 100 WinGetPos, x, y, width, , ahk_id %switcher_id% x += %direction% if x < 0 x = 0 else { SysGet screensize, MonitorWorkArea screensizeRight -= %width% if x > %screensizeRight% x = %screensizeRight% } prevdelay = %A_WinDelay% SetWinDelay, -1 WinMove, ahk_id %switcher_id%, , %x%, %y% SetWinDelay, %prevdelay% return ;---------------------------------------------------------------------- ; ; Close the switcher window if the user activated an other window ; CloseIfInactive: ifwinnotactive, ahk_id %switcher_id% send, {esc} return