How to Get Windows Master List (Task List) Using Visual Basic

See AlsoVMZ7S4


This article is reprinted from the Microsoft Knowledge Base.  To view the article, maximize your help window.  This information applies to Visual Basic for Windows, versions 2.0 and 3.0.




By calling the Windows API functions GetWindow, GetWindowText, and

GetWindowTextLength, you can get the window titles of all windows

(visible and invisible) loaded under Windows. The list of all of the

window titles under Windows is known as the master list. The Windows

Task Manager contains a list of the window titles for each of the

top-level windows (normally one per application). This list is known

as the task list.


Listed below is a sample program that demonstrates how to AppActivate

an application that is available from a list of top-level windows.


More Information:


The task list is generally a subset of the master list. The Windows

API functions only support methods of getting the master list, not the

task list. However, from the master list you can get a list of all

top-level windows closely resembling the task list. The only

difference is that the list containing the top-level windows may have

more entries than the task list. The reason for this is that it is

possible for an application to remove itself from the task list, but

it will be included as part of the master list.


The example below demonstrates how to get the names of all top-level

windows. The names of child windows can also be obtained by calling

the GetWindow API function with the GW_CHILD constant. Although the

code example only provides an example of using the constants

GW_HWNDFIRST and GW_HWNDNEXT as arguments to GetWindow, the value of

the other constants such as GW_CHILD are provided in the code as well.


Below are the steps necessary to construct a sample program that

demonstrates how to load the task list into a Visual Basic combo



1. Run Visual Basic, or choose New Project from the File menu (ALT, F,

   N) if Visual Basic is already running. Form1 will be created by



2. Change the caption property of Form1 to AppActivate.


3. Add the following controls to Form1 and change the Names as

   indicated in the chart below:


   Control             Default Name      Name

   -------             ------------      -------

   Label Control       Label1            Label1

   Combo Box           Combo1            Combo_ListItem

   Command Button      Command1          Command_Ok


4. Change the Caption properties of the controls as follows:


   Control CtlName     Caption

   ------- -------     ---------

   Label Control Label1      Application to AppActivate:

   Command Button      Command_OK  OK


5. Add the following code to the general declarations section of



    DefInt A-Z


    '* Windows API function declarations

    Declare Function GetWindow Lib "user" (ByVal hWnd, ByVal wCmd) As


    Declare Function GetWindowText Lib "user" (ByVal hWnd, ByVal

     lpSting$, ByVal nMaxCount) As Integer


    Declare Function GetWindowTextLength Lib "user" (ByVal hWnd)

     As Integer


    'Declare constants used by GetWindow

    Const GW_CHILD = 5

    Const GW_HWNDFIRST = 0

    Const GW_HWNDLAST = 1

    Const GW_HWNDNEXT = 2

    Const GW_HWNDPREV = 3

    Const GW_OWNER = 4


6. Add the following code in the Form_Load event procedure of Form1:


     Sub Form_Load ()

       Call LoadTaskList


       'Check to see if any items are in the task list, if

       'not end the program.

       If Combo_ListItem.ListCount > 0 Then

           Combo_ListItem.Text = Combo_ListItem.List(0)


           MsgBox "Nothing found in task list", 16, "AppActivate"

           Unload Form1

       End If

     End Sub


7. Enter the following code in the Click event procedure of the

   Command_Ok button:


     Sub Command_Ok_Click ()

           'Get the item selected from the text portion of the

           'combo box.

           f$ = Combo_ListItem.Text



           'Simply resume if an "Illegal function call" occurs on

           'the AppActivate statement.

           On Local Error Resume Next


           AppActivate f$

     End Sub


8. Enter the following code under the general declarations section of



     Sub LoadTaskList ()

     'Get the hWnd of the first item in the master list

     'so we can process the task list entries (top-level only).

     CurrWnd = GetWindow(Form1.hWnd, GW_HWNDFIRST)


     ' Loop while the hWnd returned by GetWindow is valid.

     While CurrWnd <> 0


           'Get the length of the task name identified by

           'CurrWnd in the list.

           Length = GetWindowTextLength(CurrWnd)


           'Get the task name of the task in the master list.

           ListItem$ = Space$(Length + 1)

           Length = GetWindowText(CurrWnd, ListItem$, Length + 1)


           'If there is an actual task name in the list, add the

           'item to the list.

           If Length > 0 Then

                 Combo_ListItem.AddItem ListItem$

           End If


           'Get the next task list item in the master list.

           CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)


           'Process Windows events.

                 x = DoEvents()


     End Sub


9. From the Run menu, choose Start (ALT, R, S) to run the program.


From the combo box, select the window title of an application

currently running under Windows. Choose the OK button to activate the