Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Agosto 19, 2013, 12:55:55 am

Título: Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 19, 2013, 12:55:55 am
Ayudando a un amigo se me presento esta inquietud, en esta parte del codigo:

Código: (VB) [Seleccionar]
   
   ...
   Set oExec = oShell.Exec(Comando)    '<--- Aqui abre la ventana DOS
   ret = oExec.StdOut.ReadAll()      '<--- Leo y lo guardo en la variable ret que luego mostrare, la ventana ya se oculto
   ...

No he encontrado forma de que la ventana DOS no se muestre, se ejecute y logre obtener datos pero que no sea visible.  ¿es posible?

Saludos
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: xkiz ™ en Agosto 19, 2013, 10:28:54 am
con FindWindow y despues ocultaria ese hwnd. asi habia hecho cuando usaba Blender que en Windows tiene una ventana en D.O.S
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: ssccaann43 en Agosto 19, 2013, 10:42:56 am
Doc, por lo general yo uso esto.

Código: (vb) [Seleccionar]
Shell ("cmd.exe"), vbHide

Pruebalo sin el vbHide y veras que se muestra, con el vbHide, veras que se oculta...!
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 19, 2013, 11:38:31 am
Doc, por lo general yo uso esto.

Código: (vb) [Seleccionar]
Shell ("cmd.exe"), vbHide

Pruebalo sin el vbHide y veras que se muestra, con el vbHide, veras que se oculta...!

Yo tambien pero el amigo en cuestion no usa Shell sino o oShell.

Aqui el codigo completo (Copy paste, 2 textboxes y un command)

Código: (VB) [Seleccionar]
Private Sub Command1_Click()
  txt_resultado.Text = ""
  txt_resultado.Text = ejecutar_Dos(Trim(txt_comando))
End Sub

Private Sub Form_Load()
Command1.Caption = " Ejecutar DOS "
txt_comando.Text = "ping 192.168.1.1"
End Sub

Function ejecutar_Dos(Comando As String) As String
    Dim oShell As WshShell
    Dim oExec As WshExec
    Dim ret As String
    Set oShell = New WshShell
    DoEvents
    ' 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


Para que el codigo funcione hay que activar la referencia Windows Script Host Object Model.


En todo caso lo que se quiere es ejecutar en el DOS unos comandos y capturarlos. Entiendo que lo correcto seria indicar cuales son esos comandos y es lo que averiguare, pero en general ¿como seria?
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 19, 2013, 11:39:50 am
con FindWindow y despues ocultaria ese hwnd. asi habia hecho cuando usaba Blender que en Windows tiene una ventana en D.O.S

Voy a ver eso, gracias.
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 19, 2013, 10:10:38 pm
Nada no encontré forma de resolver esto.

Lo único que si se es que se le pasa una ip privada, esto entrega un resultado text que se recibe en la variable ret y se muestra en formulario, el unico detalle es que no se quiere que se levante la ventana cmd ya que esta aparece por 2 segundos e incomoda.
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: raul338 en Agosto 20, 2013, 02:02:17 pm
Hay que ver el codigo de la clase para que se oculte :P

Si lo ejecuta en algun acceso directo o algo así, se muestra igual?
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 20, 2013, 02:27:03 pm
No entiendo doc ¿Cual clase?... Fíjate te pongo el proyecto aqui (https://dl.dropboxusercontent.com/u/4052038/Otros/TODO%20WEBSERVER.rar)

Lo bajas, lo ejecutas, veras que se abre la ventana cmd, se cierra y te pinta el textbox. Lo que quiero es que todo siga igual solo que no se muestre la ventana cmd. Eso no consigo. Es poquísimo código el cual mostré arriba.

Saludos
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: E N T E R en Agosto 21, 2013, 12:28:34 pm
Y no le conviene usar este code

http://support.microsoft.com/kb/300197/es (http://support.microsoft.com/kb/300197/es)

Hacer ping desde vb6, o si o si tiene que ser desde el d.o.s.

Saludos
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 21, 2013, 12:59:43 pm
No amigo, es que lo del ping es solo un ejemplo, la ip que consultare es de una empresa y lleva usuario, password y un par de parametros mas porque se esta consultado a una tarjeta electronica que prende y apaga unas maquinas, como es un dato privado no lo puedo publicar, pero los datos que entrega son exactamente como si se consultara una ip con el ping como puse en el ejemplo.

Actualmente lo usan en modo DOS y funciona, en DOS entrega un resultado en modo texto (no se como llamarlo) y eso logramos capturar en el textbox con el oShell, el unico detallito es que no queremos que levante la ventana DOS (cmd) cuando trabajamos con el aplicativo que se esta desarrollando.
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: raul338 en Agosto 21, 2013, 01:06:50 pm
Una vez postie un metodo para ejecutar una tarea y esperar a que termine, el tema es que no devuelve el texto de como se termino, pero quizas viendo las API se pueda hacer

http://leandroascierto.com/foro/index.php?topic=1673.msg9448#msg9448

El uso es

Call ShellWait("exe", "parametros", "carpeta donde se ejecuta")

el 3º parametro seria el "iniciar en" a la hora de hacer un acceso directo
(http://www.windowstecnico.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/windowstecnico/clip_5F00_image003_5F00_2C5946BC.png)
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: erbuson en Agosto 22, 2013, 09:43:47 am
Hola, en una ocasión estuve buscando algo similar y no llegué a encontrar la manera de ocultar .Exec, sólo se puede hacer con el .Run

Si te parece esta es una opcion:

Código: (VB) [Seleccionar]
Function ejecutar_Dos(Comando As String) As String
    Dim oShell As WshShell
    Dim Fichero As Integer
    Set oShell = New WshShell
    oShell.Run "%comspec% /c " & Comando & " >salida.tmp", 0, True
    Fichero = FreeFile
    Open "salida.tmp" For Input As #Fichero
    ejecutar_Dos = Input(LOF(Fichero), #Fichero)
    Close #Fichero
    Kill "salida.tmp"
End Function

No se si te puede valer en todos los casos pero utilizando el redireccionador de D.O.S., puedes crear un archivo temporal con el contenido de los datos y devolverlo después.

El .Run te permite determinar el tipo de Ventana y si o no debe esperar a terminar.

Saludos
Título: Re:Ocultar ventana DOS por usar oShell
Publicado por: YAcosta en Agosto 22, 2013, 01:51:45 pm
Muchas gracias. Voy a probar eso cuando llegue a casa.

Saludos