How VB Can Determine if a Specific Windows Program Is Running

ID Number: Q72918

1.00

WINDOWS

Summary:

To determine if a specific program is running, call the Windows API

function FindWindow. FindWindow returns the handle of the window whose

class is given by the lpClassname parameter and whose window name, or

caption, is given by the lpCaption parameter. If the returned value is

zero, the application is not running.

This information applies to Microsoft Visual Basic Programming System

version 1.0 for Windows.

More Information:

By calling FindWindow with a combination of a specific program's class

name and/or the title bar caption, your program can determine whether

that specific program is running.

When an application is started from the Program Manager, it registers

the class name of the form. The window class provides information

about the name, attributes, and resources required by your form. All

Visual Basic forms have a class name of "ThunderForm." You can

determine the class name of an application by using SPY.EXE that comes

with the Microsoft Windows 3.0 Software Development Kit (SDK).

If the window has a caption bar title, you can also use the title to

locate the instance of the running application. This caption text is

valid even when the application is minimized to an icon.

Because another instance of your Visual Basic program will have the

same class name and may have the same title bar caption, you must use

dynamic data exchange (DDE) to determine if another instance of your

Visual Basic program is running. (This DDE technique is not shown in

this article).

The following example shows three ways to determine if the Windows 3.0

Calculator is running. To create the program, do the following:

1. Create a form.

2. Declare the Windows 3.0 API function FindWindow in the Global-

Declarations section of the code window. The variables are declared

as "Any" because you can pass either a pointer to a string, or a NULL

value. You as a programmer are responsible for passing the correct

variable type. Note that the Declare statement should be entered on

just one line:

Declare Function FindWindow% Lib "user" (ByVal lpClassName As Any,

ByVal lpCaption As Any)

3. Add the following code to the form's Click event. This example

demonstrates how you can find the instance of the application with a

combination of the class name and/or the window's caption. In this

example, the application will find an instance of the Windows 3.0

calculator (CALC.EXE).

Sub Form_Click ()

Const NULL = 0&

lpClassName$ = "SciCalc"

lpCaption$ = "Calculator"

Print "Handle = ";FindWindow(lpClassName$, NULL)

Print "Handle = ";FindWindow(NULL, lpCaption$)

Print "Handle = ";FindWindow(lpClassName$,lpCaption$)

End Sub

4. Run this program with CALC.EXE running and without CALC.EXE

running. If CALC.EXE is running, your application will print an

arbitrary handle. If CALC.EXE is not running, your application will

print the number zero as a handle.

Below are some class names of applications that are shipped with

Windows 3.0:

Class Name Application

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

SciCalc CALC.EXE

CalWndMain CALENDAR.EXE

Cardfile CARDFILE.EXE

Clipboard CLIPBOARD.EXE

Clock CLOCK.EXE

CtlPanelClass CONTROL.EXE

XLMain EXCEL.EXE

Session MS-DOS.EXE

Notepad NOTE.EXE

pbParent PBRUSH.EXE

Pif PIFEDIT.EXE

PrintManager PRINTMAN.EXE

Progman PROGMAN.EXE (Windows Program manager)

Recorder RECORDER.EXE

Reversi REVERSI.EXE

#32770 SETUP.EXE

Solitaire SOL.EXE

Terminal TERMINAL.EXE

WFS_Frame WINFILE.EXE

MW_WINHELP WINHELP.EXE

#32770 WINVER.EXE

OpusApp WINWORD.EXE

MSWRITE_MENU WRITE.EXE

Reference(s):

"Programming Windows: the Microsoft Guide to Writing Applications

for Windows 3," Charles Petzold. Microsoft Press, 1990.

"Peter Norton's Windows 3.0 Power Programming Techniques," Peter

Norton and Paul Yao. Bantam Computer Books, 1990.

"Microsoft Windows 3.0 Software Development Kit: Reference Volume 1."

WINSDK.HLP file shipped with Microsoft Windows 3.0 SDK.

Additional reference words: 1.00 3.00