elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Necesito parar un proceso de MSDOS en cuanto pulso una tecla
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Necesito parar un proceso de MSDOS en cuanto pulso una tecla  (Leído 2,297 veces)
antecessor

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Necesito parar un proceso de MSDOS en cuanto pulso una tecla
« en: 7 Marzo 2015, 17:45 pm »

Hola.

  Tengo una applicación en Visual Basic 6. El objetivo es escanear una carpeta y determinar qué archivos son copias imagen de ghost, esto es, tienen extensión *.GHO. Una vez localizados, pulso el botón test que arranca la aplicación de MSDOS ghost32.exe. Esta aplicación chequea cada copia imagen para verificar si es correcta. Todo funciona bien.

  El problema viene cuando quiero parar la comprobación de las imágenes porque le va a costar mucho y necesito el ordenador para otra cosa, pues bien, no hay manera. Lo único que consigo es, manteniendo la tecla que yo determine pulsada, y cuando está a punto de terminar la comprobación que está haciendo de la copia imagen actual y va a comenzar la próxima comprobación, se pare el programa, y lo que yo quiero es que se pare, o me pregunte si quiero continuar o estoy seguro de parar en cuanto yo le pulse una tecla, por ejemplo ESC. Yo no tengo demasiada idea de Visual Basic y las partes de programa más complicadas las he cogido de código que he encontrado por ahí y adaptado a mi aplicación:

Resumiendo: necesito parar el proceso de MSDOS -ghost32.exe- mientras se esté realizando la comprobación y pulsando una vez la tecla ESC, y que me pregunte si quiero continuar  o realmente parar -salir del bucle FOR o reiniciar el programa-.

-------------------------------------------------------------------------

Private Sub Form_Load()
   
 ' intervalo para el timer para la detección de tecla
    Timer1.Interval = 50
 
   
End Sub

----------------------------------------------------------------------------

Private Sub Timer1_Timer()
   
    If GetKeyState(vbKeyEscape) < 0 Then parar = 1    ' Detecto si se ha pulsado la tecla ESCAPE
     

End Sub

----------------------------------------------------------------------------


Private Sub cmdTest_Click()            'Botón que al pulsarlo hará que se empiecen a comprobar las copias imagen
DoEvents                    'Éste es fundamental, no quitar
lblCopiasRestantes.Visible = True
lblQuedan.Visible = True
lblQuedan = lblCount
RutaArchivo = GHO(n)
'La referencia a Windows Script Host Object Model

 errorimagen = ""
 a = 0
 i = 1
 
 Restantes = narchivos
    For n = 0 To narchivos - 1
       
        DoEvents
        Restantes = narchivos - n
        lblQuedan.Caption = Restantes - 1
        temporal = RutaCorta(lstFoundFiles.List(n))
           
        'Comando = "ghost32.exe -batch -chkimg," & lstFoundFiles.List(n)   'Arranca el ghost configurado para chequear imágenes"
        Comando = "ghost32.exe -batch -chkimg," & temporal 'lstFoundFiles.List(n)   Arranca el ghost configurado para chequear imágenes"
                   
                                                        'En lstFoundFiles está la lista de archivos *.GHO encontrados con ruta completa
        errorimagen = ejecutar_Dos(Comando)          'Si la imagen es incorrecta devuelve un error                  'llamo a la función
       
       
        If parar = 1 Then Exit For       'Si hemos pulsado la tecla ESC "cero" salimos del bucle
       
        If errorimagen <> "" Then                    'Si ghost devuelve un error
           
            If i = 1 Then txtResultado.Text = "                                     Las siguientes copias imagen no son correctas" + Chr$(13) + Chr$(10)
            i = i + 1
            a = a + 1
            txtResultado.Text = txtResultado.Text + Chr$(13) + Chr$(10) 'Línea en blanco
            txtResultado.Text = txtResultado.Text + "          Error " & i - 1 & " : " + lstFoundFiles.List(n) + Chr$(13) + Chr$(10)
        End If
       
               
    Next n
     
    If a = 0 Then txtResultado.Text = "                    Todas las copias imagen son correctas:" + Chr$(13) + Chr$(10)
    CmdLimpiarTexto.Visible = True
    cmdImprimir.Visible = True
   
    End Sub

----------------------------------------------------------------------------------------------------------------------------------


Function ejecutar_Dos(Comando As String) As String   'Función para ejecutar ghost32.exe
    Dim oShell As WshShell
    Dim oExec As WshExec
    Dim ret As String
       
    Set oShell = New WshShell
   
       
    ' ejecutar el comando
    Set oExec = oShell.Exec("%comspec% /c " & Comando)
    ret = oExec.StdOut.ReadAll()
       
    ' retornar la salida y devolverla a la función
    ejecutar_Dos = ret ' Replace(ret, Chr(10), vbNewLine)
       
    DoEvents
    Me.SetFocus
End Function



Agredecería alguna ayuda al respecto. Sasludos.


En línea

okik


Desconectado Desconectado

Mensajes: 462


Ver Perfil
Re: Necesito parar un proceso de MSDOS en cuanto pulso una tecla
« Respuesta #1 en: 11 Marzo 2015, 17:25 pm »

Hola
A mi me pasó lo mismo hace tiempo...


Este código es una plantilla, un ejemplo. Analízalo (es muy sencillo) y lo aplicas a tu código.

Necisitas un PictureBox, un CommandButton y  un control Timer.

Lo que hace es emular un proceso sin fin o muy largo For/next o Do Loop. Si se pulsa escape en el evento Timer detecta la tecla ESC y le da valor Verdadero a una variable que he llamado PauseProc. Al ser verdadera en el proceso ejecuta una procedimiento llamado Esperar que emula un reloj en segundos (sin timer), y el proceso se pausa. Si se vuelve a pulsar el CommandButton continúa el proceso, que no estaba parado, si no pausado por el proceso Espera. Entonces el Timer continua (para detectar la tecla ESC) y para el proceso Espera y entonces Tu proceso continua.

Puedes crear si quieres  una variable StopProc como boleano y si es Verdadero paras el proceso definitvamente.

Espero que te sirva:

Código
  1. Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  2. Dim PauseProc As Boolean
  3. Dim Contador As Long
  4. Private Sub Command1_Click()
  5. 'comienza el proceso
  6. Timer1.Enabled = True 'Permite detectar la tecla
  7. PauseProc = False 'Permite reaundar si se había pausado (false= no parar)
  8. SimularProceso 'SIMULA EL PROCESO
  9. End Sub
  10. Private Sub Form_Load()
  11. Contador = 1
  12.    Picture1.AutoRedraw = True
  13. End Sub
  14. Private Sub Form_Unload(Cancel As Integer)
  15.    End 'Evita que no se pueda cerrar
  16. End Sub
  17.  
  18. Private Sub Timer1_Timer()
  19. Dim msgQuest As Variant
  20. If GetKeyState(vbKeyEscape) < 0 Then PauseProc = True 'para el proceso
  21.  
  22. If PauseProc = True Then 'Si se ha pulsado ESCAPE
  23.        'Muestra la pregunta
  24.        msgQuest = MsgBox("Desea pausar el proceso", vbYesNo, "Question")
  25.        'Si es no continua el proceso
  26.        If msgQuest = vbNo Then
  27.            PauseProc = False 'Continuar proceso
  28.            Else ' si es sí para el timer (para invalidar ESC)
  29.            Timer1.Enabled = False
  30.        End If
  31. Else 'Si no se ha pulsado nada
  32.    PauseProc = False 'No se pare el proceso
  33.    Timer1.Enabled = True 'Atento si se pulsa ESC
  34. End If
  35. End Sub
  36. '////////////////////////////////////////
  37. 'SIMULA UN PROCESO FOR/NEXT O DO/LOOP
  38. '////////////////////////////////////////
  39. Public Function SimularProceso()
  40. For i = Contador To 3 ^ 14
  41. Contador = i 'Memoriza el último estado
  42.    Picture1.Cls
  43.    Picture1.Print i
  44.    DoEvents
  45. 'Si se ha pausado pausa durante 3600 segundos (un hora)
  46. If PauseProc = True Then Espera (3600)
  47. Next i
  48. End Function
  49.  
  50. '////////////////////////////////////////
  51. 'Espera un determinado tiempo en segundos
  52. '////////////////////////////////////////
  53. Private Sub Espera(Segundos As Single)
  54.  Dim ComienzoSeg As Single
  55.  Dim FinSeg As Single
  56.  ComienzoSeg = Timer
  57.  FinSeg = ComienzoSeg + Segundos
  58.        If PauseProc = False Then Exit Sub ' Si pulsas continuar deja de esperar
  59.  Do While FinSeg > Timer
  60.      DoEvents
  61.      If ComienzoSeg > Timer Then
  62.          FinSeg = FinSeg - 24 * 60 * 60
  63.      End If
  64.  Loop
  65. End Sub


Esto es una forma muy rebuscada. Pero si quieres en lugar de usar For/next  o Do /Loop metes el proceso en el un Timer y cuando te interese lo estableces a False y cuando quieras reaundar a True. Es más sencillo.


« Última modificación: 11 Marzo 2015, 17:35 pm por okik » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines