Cycle through open Windows applications

14,807

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
Share:
14,807
Ian Burns
Author by

Ian Burns

Updated on July 09, 2022

Comments

  • Ian Burns
    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.

    1. Simulating the Alt+Tab keypress just toggles the two most recently used apps instead of cycling through them all, and
    2. 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
    Makaveli84 over 9 years
    This 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 the wshSystemEnv.Remove("AlreadyRunning") statement to the top of the Else block (prior to the WMI loop), though this is not an optimal solution since neither iterations (on/off) of the script will ever reach the tidy up segment.