Visual Basic - AYUDA! D:

Life is soft - evento anual de software empresarial
   
Vista:

AYUDA! D:

Publicado por Jannet mjmi02@outlook.es (4 intervenciones) el 03/06/2014 01:47:08
Necesito hacer un programa que haga que corra otro programa y que al momento de que se cierre , haga que se vuelva a abrir , lo necesdito super urgente, ya que los trabajadores cierran el programa y ellos no tienen acceso alguno a la computadora asi que a cada rato tienen que estar hablando al dpto de sistemas, gracias! :D
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana

AYUDA! D:

Publicado por Antoni Masana (88 intervenciones) el 03/06/2014 07:03:54
Puedes probar con un BAT

1
2
3
4
@ECHO OFF
:Main
START /WAIT Programa
GOTO Main
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AYUDA! D:

Publicado por Pico (114 intervenciones) el 03/06/2014 08:27:18
La manera de hacer eso es impidiendo al programa cerrarse, y eso se hace, por ejemplo, con un hook.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Oscar

AYUDA! D:

Publicado por Oscar (63 intervenciones) el 03/06/2014 10:29:22
Estoy de acuerdo con Pico, la mejor solución es que el usuario no pueda cerra la aplicación.

Si ésta no es tuya y no tienes acceso a su código fuente hay muchas formas de abrir una aplicación con 'otra', si este es el caso yo te aconsejaría que hicieras una aplicación que con una tarea programada que se ejecute cada x tiempo; esta aplicación consulta si la que tu quieres abrir, si ya esta en proceso no hace nada y se cierra y si no esta en proceso la abre. La tarea programada puedes configurarla para que se ejecute solo durante la jornada laboral.

SI te interesa algo así dímelo que tengo por ahí algún ejemplo de código que uso a veces
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AYUDA! D:

Publicado por Jann mjmi02@outlook.es (4 intervenciones) el 03/06/2014 14:52:42
Si porfavor me interesada ver el código o como hacerle porque no tengo acceso al código del programa . gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Oscar

AYUDA! D:

Publicado por Oscar (63 intervenciones) el 03/06/2014 15:17:39
Esto es parte de un código que utilizo para matar procesos en windows (si lo quiers te lo paso) pero te dejo el trozo de código que te localiza un proceso

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Public 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 * 260
End Type
 
Public Const TH32CS_SNAPPROCESS = &H2&
 
Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Public Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
 
Public Function BuscarProceso(Nombre As String) as boolean
Dim Retorno As Long
Dim SigProceso As Long
Dim TipoP As PROCESSENTRY32
Dim X As Long
Dim Codigo As Long
Dim CodSalida As Long
 
BuscarProceso = False
Retorno = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
If Retorno <> -1 Then
    TipoP.dwSize = Len(TipoP)
    SigProceso = Process32First(Retorno, TipoP)
    Do While SigProceso
        If InStr(1, UCase(TipoP.szExeFile), UCase(Nombre)) > 0 Then
            BuscarProceso = True
            CloseHandle Codigo
        End If
        SigProceso = Process32Next(Retorno, TipoP)
    Loop
    CloseHandle (Retorno)
End If
 
End Sub


Ahora para iniciar un programa puedes utilizar el siguiente código.

1
2
3
4
5
6
7
8
9
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
        ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long) As Long
 
Call ShellExecute(0&, vbNullString, "Nombre del ejecutable", vbNullString, "Ruta del ejecutable", 1&)


Hay muchas mas formas de hacerlo (como siempre en programación) y habrá formas más sencillas, posiblemente. Pero esta te debería de funcionar. Para cualquier duda aquí estamos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AYUDA! D:

Publicado por Jannet (4 intervenciones) el 03/06/2014 17:19:27
GRACIAS! :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AYUDA! D:

Publicado por Pico (114 intervenciones) el 04/06/2014 02:48:50
Pues sí que hay una manera más sencilla, sí. Si para lanzar el programa en vez de usar ShellExecute usas Shell y le pasas al parámetro wait el valor true, Shell no vuelve hasta que no cierres el programa lanzado. Cuando vuelva puedes comprobar si la hora es de horario laboral, y si lo es volver a lanzarlo. 3 líneas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Oscar

AYUDA! D:

Publicado por Oscar (63 intervenciones) el 04/06/2014 10:11:22
Esa me la apunto, gracias

Una duda, cuando se ejecuta por primera vez Shell y ya hay una instancia del programa que estas abriendo, abre una nueva supongo (no verifica que ya este abierto ya que lo seguirá por el idprocess o similar).

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AYUDA! D:

Publicado por Pico (114 intervenciones) el 04/06/2014 11:16:19
Sí, abre uno nuevo. Luego, si el wait está a true, hace un WaitForSingleObject al HPROCESS del proceso recien abierto, que detiene el hilo mientras no se haya cerrado.

Lo que se puede hacer es permitir lanzar ese programa sólo a través del otro, no poniendo ningún enlace o acceso directo a él en ningún sitio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Oscar

AYUDA! D:

Publicado por Oscar (63 intervenciones) el 04/06/2014 15:48:29
Yo, por mi experiencia, soy de hacer las aplicaciones a prueba de usuarios. En mi empresa son muy de pulsar varias veces el ejecutable si tarda un poco en abrirse, seguro que abren la aplicación varias veces hasta que ven alguna ventana por lo que controlo siempre que no este en ejecución.

En este caso aunque no tuvieran la opción de arrancar la aplicación manualmente (sólo a través de la nueva) seguro que abren varios procesos de la misma con los consiguiente varios procesos de la que usan para trabajar.

No obstante tu solución es buena sobre todo si no se permite al usuario abrir la aplicación (ninguna de las 2), se deja la aplicación principal subordinada a que la 'arranque' la nueva aplicación, y ésta se controla por una tarea programada.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AYUDA! D:

Publicado por Pico (114 intervenciones) el 06/06/2014 12:00:02
Para no permitir abrir otro programa también se puede buscar su ventana en vez de listar todos los procesos. Si un FindWindow no devuelve NULL es que el programa ya está sacado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar