5

The LA Fox Developer Newsletter
March 1998
Checking for Instantiated
Windows
by Charlie Parker

Here is a handy function that can be used in Visual FoxPro to determine if your application is already running or if a specific window has already been instantiated. It checks for the existence of a window with a specified caption and returns a logical value indicating it existence or non-existence. It also optionally wilt minimize, normalize or maximize the window if it finds it.

*
APPRUNNING This function will check to see
*
if an instance of this application is already
*
running. If so, then it will activate that
*
instance and return a .T. condition. Otherwise,
*
it will just return a .F. condition. When
*
activating the window, the second parameter
*
tells how to show the window (e.g. normalized,
*
minimized or maximized).
FUNCTION APPRUNNING (tcAppName, tnWindowSize)
*__ Parameters:
*__ 1) tcAppName:
The caption in the window to check for.
2)
tnWindowSize:
0
(or omitted) Don’t show the window,
I = Show the window Normalized,
2
= Show the window Minimized,
3
= Show the window Maximize
*__ If the second parameter is not passeu, then assume we don’t want to show the window,
*__ we just want to know if it exists. IF TYPE(”tnWindowSize”) <> “N”
tnWindowSize = 0
ENDIF

LOCAL lcNull, InAppHandle, IlReturnValue
IcNuII = .NULL.
IlReturnValue = .F.

*__ Define the Windows API routines. DECLARE INTEGER FlndWindow IN W1N32API
STRING IcNulI, STRING tcAppName

DECLARE INTEGER ShowWindow IN WIN32API; INTEGER InAppHandle, INTEGER tnWindowSize

*__ Get the handle of the specified window. This will return zero if no such window exists. InAppHandle = FindWindow(IcNulI, tcAppName)

IF lnAppHandle <> 0
IlReturnValue = .T.

*__ If the window size parameter is zero,
*__
then don’t show the window, just report
back that It is there.
IF tnWindowSize > 0
ShowWindow(InAppHandle, tnWindowSlze)
ENDIF
ENDIF

RETURN IlReturnValue
Checkina To See If Your Application Has Already Been I Launched

In order for this function to work, your application must have a main window with a unique caption. This can be a top-level form or the FoxPro window. Since the function checks for windows with a specific caption, then if you dynamically Change the caption the function may not return the expected value.

To use the function, put in code similar to the following at the beginning of your main program:

IF APPRUNNING(”My Application’s Caption”, 3)
RETURN
ENDIF


This will call the APPRUNNING function that will check to see if there is a window with the caption “My Application’s Caption”. If so, then it will maximize that window and return a .T. condition causing the second instance to terminate.

Checkina For Activated Windows.

If your application restricts specific windows to one instance of thatwindow, then the APPRUNNING function can be used for this too. I recently developed an application that keeps track of different development projects. The main screen is just a grid that contains the name of the development project and the path to where the data is for that project. The control source for the•
table called that "Projects.dbf" with two fields - ProjName (Project Name) and Proj DBC (full path to where the DBC is for the project).

To display the status of a project, the user first clicks on the row in the grid containing the project, then clicks on the “Display Project” button. This then opens the DBC (specified in the Projects.ProjDBC field) and displays the project information form (called ProjTrak).

The caption of the ProjTrak form is set to the project name (from the Projects.ProjName field). Thus, each instance of the project information form has a unique caption.

If the ProjTrak form has already been instantiated for a given project, then I don’t want to open that DBC again and try to instantiate another instance of that project. I used the APPRUNNING function to check for this. The click event for the “Display Project” button looks something like this:

IF NOT APPRUNNING(ALLTRIM(Projects.ProjName), 1)

LOCAL IcDBC
IcDBC = Projects.Pr0jDBC

OPEN DATABASE &IcDBC

DO FORM ProjTrak WITH alltrim(Projects.ProjName)

ENDIF


(Con't page 6)
Page 5

5