Buenas a todos. Si nosotros queremos que al ejecutar nuestro programa se nos abra otra vez podemos poner en el FormLoadShell(app.path & "\" & app.exename & ".exe")
Sin embargo al abrirse nuevamente volveria a abrir otra instancia de si mismo y asi hasta tener el mismo programa infinitas veces en ejecucion.
Pero yo lo que quiero es tener solo dos ejecuciones del mismo, una la que yo ejecuto manualmente y otra la que se ha abierto despues. Espero me puedan ayudar con esto.
Y si no lo pones en el formload y lo pones en un command o condicionas un evento para que se ejecute otra vz
Podes usar la API FindWindow y si se encuentran 2 ventanas con el titulo de tu form que no se ejecute nuevamente el programa.
Saludos.-
Cita de: ®ØßÖkÖÞ en 26 Marzo 2006, 19:32 PM
Y si no lo pones en el formload y lo pones en un command o condicionas un evento para que se ejecute otra vz
He de ponerlo en el FormLoad y no en un boton ya que necesito que su ejecucion sea transparente para el usuario y que no necesite de la intervencion del mismo.
Es obvio que necesito una condicion pero no se cual.
Cita de: NYlOn en 26 Marzo 2006, 19:38 PM
Podes usar la API FindWindow y si se encuentran 2 ventanas con el titulo de tu form que no se ejecute nuevamente el programa.
Esta podria ser una buena condicion pero creo que para mi programa no serviria ya que sus ventanas estarian ocultas. Es mas, no tienen ni ventanas, solo modulos.
Alguna otra sugerencia mas?
busca en los procesos si encontras mas de dos pues end
el metodo que yo utilizaria seguro q es el peor pero yo escribiria en un archivo.txt las veces q esta abierto y si es >= 2 pues end x'D
Cita de: LaN en 27 Marzo 2006, 15:58 PM
el metodo que yo utilizaria seguro q es el peor pero yo escribiria en un archivo.txt las veces q esta abierto y si es >= 2 pues end x'D
Eso mismo lo habia pensado pero en su version mas... profesional. ;) Y seria escribiendo en el registro cuando el primero abre, y cuando el segundo lo lea que no abra y borre lo escrito.
That's the ticket ;D
hola estamos ablando de dos corriendo, no tres ni uno, ni mas si decimos una entonese utilizamos el app.instanse, pero ablamos de dos para que no se abra un tercero no???
y con lo que decian del archivo de texto o el registro, esto traeria una complicacion que si el programa se cuelga y hay que cerrarlo forzado pues seguramente el archvio o el registro quedaria incompleto (firgurarian dos mientras que posiblemnete aya uno o ninguno)
entonces lo recomendable es contar en los procesos cuantas veces figura el exe
Ahi esta, con dos cojones, defendiendo tu idea!!! ;D
Bromas a parte, llevas razon. En este mismo instante no se como leer los procesos en ejecucion pero se que se puede hacer y se donde buscar. Otra cosa: crees que podre seguir esa idea si uso taskbar.hide = false?
te paso el code, fijate que para que funcione primero tenes que generar el exe
Option Explicit
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Private Sub Form_Load()
Comprovar
End Sub
Sub Comprovar()
Dim hSnapShot As Long, uProcess As PROCESSENTRY32, r As Long, Contador As Integer
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
Dim Proceso As String
Do While r
Proceso = Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
If UCase(App.EXEName & ".exe") = UCase(Proceso) Then
Contador = Contador + 1
If Contador > 2 Then End
End If
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Sub
Otra opcion es pasarle como parametro al ejecutable la cantidad de instancias que se van llamando:
Private Instancias As Long
Private Sub Form_Load()
Instancias = Val(Command)
Instancias = Instancias + 1
If Instancias < 2 Then
Shell (App.Path & "\" & App.EXEName & " " & Instancias)
End If
End Sub
Saludos