Cycle through open Windows applications
Solution 1
Turned out VBScript in WHS was the way to go. This seems to work.
'****************************************************************************************
' Script Name: ApplicationCycler.vbs
' Author: Ian Burns
' Date: 2 Dec 2011
' Description: VBScript for Windows Scripting Host. Cycles through any applications
' visible in the Task Bar giving them focus for a set period.
' Usage: Save file to Desktop and double click to run. If it isn't already running,
' it will start. If it is already running, it will stop.
'*****************************************************************************************
Option Explicit
Dim wshShell
Dim wshSystemEnv
Dim strComputer
Dim objWMIService
Dim colProcessList
Dim objProcess
Dim intSleep
' Loop lasts 5 seconds
intSleep = 5000
Set wshShell = CreateObject("WScript.Shell")
' Volatile environment variables are not saved when user logs off
Set wshSystemEnv = wshShell.Environment("VOLATILE")
' Check to see if the script is already running
If len(wshSystemEnv("AlreadyRunning")) = 0 Then
' It isn't, so we set an environment variable as a flag to say the script IS running
wshSystemEnv("AlreadyRunning") = "True"
' Now we go into a loop, cycling through all the apps on the task bar
Do
' Simulate the Alt+Esc keypress
wshShell.SendKeys "%+{Esc}"
Wscript.Sleep intSleep
Loop
Else
' It IS already running so kill any or all instances of it
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'WScript.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
' Delete the environment variable
wshSystemEnv.Remove("AlreadyRunning")
' Tidy up
Set wshSystemEnv = Nothing
Set wshShell = Nothing
Set objWMIService = Nothing
Set colProcessList = Nothing
End If
Solution 2
For what it's worth, here's a "cleaner" solution (check my comment on the proposed solution) based on Ian Burns' script:
'****************************************************************************************
' Script Name: ApplicationCycler.vbs
' Author: Ian Burns
' Date: 2 Dec 2011
' Edited By: Makaveli84
' Edit Date: 30 Aug 2014
' Description: VBScript for Windows Scripting Host. Cycles through any applications
' visible in the Task Bar giving them focus for a set period.
' Usage: Save file to Desktop and double click to run. If it isn't already running,
' it will start. If it is already running, it will stop.
'*****************************************************************************************
Option Explicit
Dim wshShell
Dim wshSystemEnv
Dim intCycle
Dim intSleep
Dim intTimer
' Cycle every 5 seconds / Check on/off status every 250 milliseconds
intCycle = 5000: intSleep = 250: intTimer = intCycle
Set wshShell = CreateObject("WScript.Shell")
' Volatile environment variables are not saved when user logs off
Set wshSystemEnv = wshShell.Environment("VOLATILE")
' Check to see if the script is already running
If len(wshSystemEnv("AlreadyRunning")) = 0 Then
' It isn't, so we set an environment variable as a flag to say the script IS running
wshSystemEnv("AlreadyRunning") = "True"
' Now we go into a loop, cycling through all the apps on the task bar
Do While len(wshSystemEnv("AlreadyRunning")) > 0
' Simulate the Alt+Esc keypress
If intTimer >= intCycle Then
wshShell.SendKeys "%+{Esc}"
intTimer = 0
End If
intTimer = intTimer + intSleep
Wscript.Sleep intSleep
Loop
Else
' Delete the environment variable
wshSystemEnv.Remove("AlreadyRunning")
End If
' Tidy up
Set wshSystemEnv = Nothing
Set wshShell = Nothing
Solution 3
It's late and I did need a way to turn this excellent solution on and off manually. Therefore, tested on xp Pro sp3:
'****************************************************************************************
' Script Name: Turn ON Loop thru open apps.vbs
' Author: Ian Burns
' Date: 2 Dec 2011
' Description: VBScript for Windows Scripting Host. Cycles through any applications
' visible in the Task Bar giving them focus for a set period.
' Usage: Save file to Desktop and double click to run. If it isn't already running,
' it will start. If it is already running, it will stop.
'*****************************************************************************************
' http://stackoverflow.com/questions/8356046/cycle-through-open-windows-applications
Option Explicit
Dim wshShell
Dim wshSystemEnv
Dim strComputer
Dim objWMIService
Dim colProcessList
Dim objProcess
Dim intSleep
' Do Loop lasts 5 seconds
intSleep = 5000
Set wshShell = CreateObject("WScript.Shell")
' Volatile environment variables are not saved when user logs off
Set wshSystemEnv = wshShell.Environment("VOLATILE")
If len(wshSystemEnv("AlreadyRunning")) = 0 Then
' It isn't, so we set an environment variable as a flag to say the script IS running
wshSystemEnv("AlreadyRunning") = "True"
' Now we go into a loop, cycling through all the apps on the task bar
do
' Simulate the Alt+Esc keypress
wshShell.SendKeys "%+{Esc}"
Wscript.Sleep intSleep
loop
' Tidy up
Set wshSystemEnv = Nothing
Set wshShell = Nothing
Set objWMIService = Nothing
Set colProcessList = Nothing
End If
and:
'****************************************************************************************
' Script Name: Turn OFF Loop thru open apps.vbs
' Author: Dave
' Date: 1 Mar 2012
' Description: Turns off the above.
' '*****************************************************************************************
Option Explicit
Dim wshShell
Dim wshSystemEnv
Dim strComputer
Dim objWMIService
Dim colProcessList
Dim objProcess
Dim intSleep
Set wshShell = CreateObject("WScript.Shell")
' Volatile environment variables are not saved when user logs off
Set wshSystemEnv = wshShell.Environment("VOLATILE")
' It IS already running so kill any or all instances of the above
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'WScript.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
' Delete the environment variable
wshSystemEnv.Remove("AlreadyRunning")
' Tidy up
Set wshSystemEnv = Nothing
Set wshShell = Nothing
Set objWMIService = Nothing
Set colProcessList = Nothing
Ian Burns
Updated on July 09, 2022Comments
-
Ian Burns almost 2 years
I need some help on which way to go with something that seemed at first like a very simple requirement.
I have to find a method of cycling through open applications on a Windows PC, with the objective of displaying the windows for say 30 seconds at a time on a large screen mounted on a wall. Typically there will be an MS Access report and a couple of web pages.
My initial thinking was that I could open these apps manually on the PC, then run a VBScript to cycle through them. However there were two problems with this.
- Simulating the Alt+Tab keypress just toggles the two most recently used apps instead of cycling through them all, and
- There is no possibility I can see for the user to be able to escape out of the script using a keypress.
Can anyone suggest how I can achieve this using resources already available on a Windows (XP upwards) machine?
-
Makaveli84 over 9 yearsThis solution has a major flaw in its logic. The "off" segment (the
Else
block) terminates itself before deleting the "AlreadyRunning" environment variable which blocks the script from running again until the user logs off. A quick fix would be moving thewshSystemEnv.Remove("AlreadyRunning")
statement to the top of theElse
block (prior to the WMI loop), though this is not an optimal solution since neither iterations (on/off) of the script will ever reach thetidy up
segment.