RE:Detectar que un programa ya está en marcha
La mejor manera es utilizando en el load del form inicial o en el Main que inicia tu programa, la sentencia App. Previnstance , el cual te devuelve true si es que la aplicación ya se encuentra levantada.
en este caso, podés bajarla usando la API FindWindows y el nombre de la ventana , para que te devuelva el handle y después la API SendMessage lo cerrás.
Ejemplo:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
Private Const WM_CLOSE = &H10
Private sub CommandButton_Click( )
Dim z as Long
Dim Ventana as String '
Ventana= "Calculadora"
z = FindWindow(vbNullString,Ventana) ' Busca la ventana y si la encuentra prendida, carga su handle en la variable z
If z <> 0 then
call SendMessage(z, WM_CLOSE, 0, 0)
else
msgbox " No está la calculadora prendida"
endif
en sub
Este código funciona bien sobre WinX, pero realmente no se si funciona sobre NT, espero que así, sea, sino que algún alma caritativa de este foro te lo perfeccione para que surja efecto.
Buena suerte