La Web del Programador: Comunidad de Programadores
 
    Pregunta:  53645 - EVITAR MULTIPLES EJECUCIONES DE MI PROGRAMA.-
Autor:  Andy Panda
Hola a todos. Mi pregunta es bien concreta:

Hasta ahora he utilizado el siguiente codigo para evitar que mis programas sean abiertos en multiples instancias en un pc:

Private sFormCaption
DECLARE INTEGER FindWindow IN user32 string @Class, string @titre
sFormCaption = "MyApplication"
IF FindWindow(0, sFormCaption) != 0
QUIT
ENDIF

pero mi objetivo final es poder recrear el comportamiento que por ejemplo tiene el mesenger, es decir :

- Evitar que este se ejecute mas de una vez.
- Si ya esta abierto, maximar el programa si vuelvo a intentar ejecutarlo.

Espero que alguien me pueda entregar algun comentario.
Desde ya gracias a todos los de esta comunidad.-

  Respuesta:  Salvador Ruiz Campos
Yo resolví este problema determinando que aplicaciones están en ejecución en un momento determinado. El código que te anexo lo encontré en el sitio de MicroSoft. Espero que te sirva.

LOCAL awin_apps, vfp_handle, ln_current_window,ln_window_count
* Dimension array awin_apps to store running apps
DIMENSION awin_apps[1]
* Initialize variable to store handle for current application
vfp_handle=0
* Declare API Functions
DECLARE INTEGER FindWindow ;
IN win32api ;
INTEGER nullpointer, ;
STRING cwindow_name
DECLARE INTEGER GetWindow ;
IN win32api ;
INTEGER ncurr_window_handle, ;
INTEGER ndirection
DECLARE INTEGER GetWindowText ;
IN win32api ;
INTEGER n_win_handle, ;
STRING @ cwindow_title, ;
INTEGER ntitle_length
* End of API function declarations
* Get handle for current application
vfp_handle=findwindow(0,_SCREEN.CAPTION)
* Store handle of current app to a variable
ln_current_window=vfp_handle
* Initialize a count variable used to dimension array of running apps
ln_window_count=0
DO WHILE ln_current_window>0
* Initialize variable to store application title
lc_window_title=SPACE(255)
* Call to GetWindowText to fetch window caption
ln_length=getwindowtext(ln_current_window, ;
@lc_window_title,LEN(lc_window_title))
* Note that the lc_window_title variable is used as a buffer to
* receive text from the call to GetWindowText
IF ln_length>0
lc_window_title=STRTRAN(TRIM(lc_window_title),CHR(0),"")
ELSE
lc_window_title=""
ENDIF
IF ln_current_window>0 .AND. !EMPTY(lc_window_title)
* Increment the window count and re-dimension the array of running
* applications
ln_window_count=ln_window_count+1
DIMENSION awin_apps(ln_window_count)
awin_apps[ln_Window_Count]=lc_window_title
ENDIF
* Call to GetWindow to fetch handle of running applications.
ln_current_window=getwindow(ln_current_window,2)
ENDDO
CREATE TABLE runapps (appname m)
IF ALEN(awin_apps,1)>0
SELECT runapps
APPEND BLANK
FOR i=1 TO ALEN(awin_apps,1)
REPLACE appname WITH awin_apps[i]+CHR(13) ADDITIVE
NEXT
ENDIF
MODIFY MEMO appname NOEDIT