Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Lekim

#241
Hola

KresH ya te ya contestado correctamente.

Código (vb) [Seleccionar]
Msgbox(tpautas(1))

o como te ha contestado KresH

Pero si estás en VB(5 o 6) o NET no hay problema en empezar a ingresar valores al array a partir de (1).  

En Vb6 puedes definir el Array así tpautas(1 to  14) y no habría ningún tpautas(0):

Código (vb) [Seleccionar]
Dim tpautas(1 to 14) as String 'Desde 1 a 14

Pero si lo defines así tpautas(14) entonces hay un tpautas(0) que no usas, pero tampoco pasaría nada, solo debes acordarte que está ahí según lo que hagas para evitar errores:

Código (vb) [Seleccionar]
Dim tpautas(14) as String 'Desde 0 a 14


Si estás en VB.NET entonces no puedes poner Dim tpautas(1 to 14) as String debes poner :

Código (vbnet) [Seleccionar]
Dim tpautas(14) as String 'Desde 0 a 14

y tendrías un tpautas(0)...


Sldos
#242
Hola...
Entiendo que estás en VB y no VB.NET dicho esto no entiendo muy bien lo que quieres pero a ver si te sirve esto. Muestra el mensaje al pulsar Enter.


Código (vb) [Seleccionar]
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
Text1.SetFocus
MsgBox ("La Transferencia Ha Sido Completada")
End If
End Sub



En VB.NET
Código (vbnet) [Seleccionar]
  Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
       If e.KeyChar = Convert.ToChar(Keys.Enter) Then
           MsgBox("La Transferencia Ha Sido Completada")
       End If
   End Sub


Según entiendo quieres introducir una información y luego ingresar dicha información. 'Enter' sería el acto en sí de 'ingresar información' o 'Aceptar' e inmediatamente al pulsar muestra el mensaje.  

#243
Gracias Elektro
¿Entonces según eso mi código no funcionaría en 64bits?
Tengo un PC con W764bits ahora lo pruebo y hago los cambios... jeje

Por cierto, se hace muy engorroso ver el código con el <summary>

Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Changes an attribute of the specified window.
''' <para></para>
''' The function also sets the 32-bit (<c>LONG</c>) value at the specified offset into the extra window memory.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <remarks>
''' <see href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms633591%28v=vs.85%29.aspx"/>
''' </remarks>


Creo que está bien pero en el navegador tienes que ir bajando y bajando.... :¬¬

Sl2s
#244
Hola

He creado este código para cambiar el estilo de las ventanas, se puede invertir la barra de título sin alterar el resto del form, bloquear el form, quitar los botones, desactivar botones de la barra, cambiar la posición de título de la barra de título, quitar los bordes, mostrar el form como un popup menú, etc.

Los cambios son combinables en algunos casos.



CAMBIAR EL ESTILO DE LAS VENTANAS

Código (vbnet) [Seleccionar]
#Region "Cambiar estilo de la ventana"
Public Module modChangeStyleWindow
   Const GWL_ID = (-12)
   Const GWL_STYLE = (-16)
   Const HWND_NOTOPMOST = -2
   Const SWP_NOZORDER = &H4
   Const SWP_NOSIZE = &H1
   Const SWP_NOMOVE = &H2
   Const SWP_FRAMECHANGED = &H20
   Const SWP_DRAWFRAME = SWP_FRAMECHANGED

   Enum WindowsStyle
       WS_SIZABLE = &H0                                'Con todos los botones y la barra de título
       WS_SIZABLE_DISABLEMAXB = &HFFFFFFFFFFFFFFFF     'Desactiva el botón maximizar
       WS_SIZABLE_DISABLEMINB = &HFFFFFFFFFFFE5E08     'Desactiva el botón minimizar
       WS_DLGFRAME_DISABLE = &H5FD8220                 'Cuadro diálogo desactivado (no permite ninguna interacción con el form)
       WS_DLGFRAME_FIXEDSINGLE = &HFFFFFFFFFFF9CA28    'Cuadro diálogo no redimensionable
       WS_DLGFRAME_SIZABLE = &HFFFFFFFFFFFDC5B0        'Cuadro diálogo redimensionable
       WS_DISABLED = &H8000000                         'Desactivado (no permite ninguna interacción con el form)
       WS_SYSMENU_DISABLE = &H5F5E100                  'Desactiva el menú y desactivado              
       WS_SYSMENU_SIZABLE = &HFFFFFFFFFFF8F350         'Desactiva el menú y redimensionable
       WS_SYSMENU_FIXEDSINGLE = &HFFFFFFFFFFF4EC10     'Desactiva el menú y no es redimensionable
       WS_FIXEDSINGLE = &HFFFFFFFFFFFCEAF0             'No redimensionable
       WS_FIXEDSINGLE_DISABLEMAXB = &HFFFFFFFFFFFBBA40 'No redimensionable y desactiva el botón maximizar
       WS_FIXEDSINGLE_DISABLEMINB = &HFFFFFFFFFFFAEF20 'No redimensionable y desactvia el botón minimizar
       WS_NOBORDER = &H325AA0                          'Sin bordes
       WS_FLAT3D = &HB1FE68                            'Sin bordes con línea exterior
       WS_POPUP = &H712CA8                             'Menú Popup
   End Enum

   <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
   Private Function SetWindowLong(ByVal hwnd As IntPtr, _
                                         ByVal nIndex As Integer, _
                                         ByVal dwNewLong As Integer) As Integer
   End Function


   <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=False)> _
   Private Function SetWindowPos(ByVal hwnd As IntPtr, _
                                        ByVal hWndInsertAfter As IntPtr, _
                                        ByVal X As Integer, _
                                        ByVal y As Integer, _
                                        ByVal cx As Integer, _
                                        ByVal cy As Integer, _
                                        ByVal wFlags As Integer) As Integer
   End Function


   <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowLongA", SetLastError:=True)> _
   Private Function GetWindowLong(ByVal hWnd As IntPtr, _
                                         <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.I4)> ByVal nIndex As Integer) As Integer
   End Function

   Public Sub ChangeStyleWindow(ByVal hwnd As IntPtr, ByVal StyleForm As Integer, ByVal SetStyle As Boolean)
       'mantiene el tamaño de la ventana
       Dim stl As Integer = GetWindowLong(hwnd, GWL_STYLE)

       Select Case SetStyle
           '//Solo Ventana 'Sizable'
           'Case True : If stl = &H16CF0000 Then stl += StyleForm
           'Case False : If stl = &H16CF0000 + StyleForm Then stl -= StyleForm
           '//Cualquier tipo de ventana u objeto con handle
           Case True : stl += StyleForm
           Case False : stl -= StyleForm
       End Select

       SetWindowLong(hwnd, GWL_STYLE, stl)
       Call SetWindowPos(hwnd, HWND_NOTOPMOST, Nothing, Nothing, Nothing, Nothing, _
       SWP_NOZORDER + SWP_NOSIZE + SWP_NOMOVE + SWP_DRAWFRAME)
   End Sub

End Module
#End Region



CAMBIAR EL ESTILO DE LA BARRA
Código (vbnet) [Seleccionar]
Region "Cambiar estilo de la Barra de Título"
Module modChangeStyleBar
   Const GWL_ID = (-12)
   Const GWL_STYLE = (-16)
   Const GWL_EXSTYLE = (-20)
   Const HWND_NOTOPMOST = -2
   Const SWP_NOZORDER = &H4
   Const SWP_NOSIZE = &H1
   Const SWP_NOMOVE = &H2
   Const SWP_FRAMECHANGED = &H20
   Const SWP_DRAWFRAME = SWP_FRAMECHANGED

   Enum WStyleBarTitle
       WStB_NORMAL_THICKBORDER = &H200                             'Normal con borde ancho
       WStB_NORMALCAPTIONLEFT = &H0                                'Título a la izquierda
       WStB_NORMAL_CAPTIONRIGHT = &H1000                           'Título a la derecha
       WStB_INVERT_CAPTIONLEFT = &H405000                          'Invertido con título a la izquierda
       WStB_INVERT_CAPTIONRIGHT = &H400000                         'Invertido con título a la derecha
       WStB_TOOLWINDOW_CAPTIONLEFT = &H6590                        'Tool window con título a la izquierda y borde fino
       WStB_TOOLWINDOW_CAPTIONRIGHT = &H5580                       'Tool window con título a la derecha y borde fino
       WStB_TOOLWINDOW_THICKBORDER_CAPTONLEFT = &H68F              'Tool window con título a la izquierda y borde grueso
       WStB_TOOLWINDOW_THICKBORDER_CAPTONRIGHT = &H5A80            'Tool window con título a la derecha y borde grueso
       WStB_TOOLWINDOWS_INVERT_CAPTIONLEFT = &H401080              'Tool window Invertido con título a la izquierda y borde fino
       WStB_TOOLWINDOWS_INVERT_CAPTIONRIGHT = &H400180             'Tool window invertido con título a la derecha y borde fino
       WStB_TOOLWINDOWS_INVERT_THICKBORDER_TITLELEFT = &H403390    'Tool window Invertido con título a la izquierda y borde grueso
       WStB_TOOLWINDOWS_INVERT_THICKBORDER_TITLERIGHT = &H400290   'Tool window invertido con título a la derecha y borde grueso
       WS_EX_DLGMODALFRAME = &H1
       WS_EX_NOPARENTNOTIFY = &H4
       WS_EX_TOPMOST = &H8
       WS_EX_ACCEPTFILES = &H10                                    'Cambia el cursor cuando se arrastr un archivo a la ventana
       WS_EX_TRANSPARENT = &H20
       WS_EX_MDICHILD = &H40
       WS_EX_TOOLWINDOW = &H80
       WS_EX_WINDOWEDGE = &H100
       WS_EX_CLIENTEDGE = &H200
       WS_EX_CONTEXTHELP = &H400
       WS_EX_RIGHT = &H1000
       WS_EX_LEFT = &H0
       WS_EX_RTLREADING = &H2000
       WS_EX_LTRREADING = &H0
       WS_EX_LEFTSCROLLBAR = &H4000
       WS_EX_RIGHTSCROLLBAR = &H0
       WS_EX_CONTROLPARENT = &H10000
       WS_EX_STATICEDGE = &H20000
       WS_EX_APPWINDOW = &H40000
       WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE)
       WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST)
       WS_EX_LAYERED = &H80000
       WS_EX_NOINHERITLAYOUT = &H100000 ' Disable inheritence of mirroring by children
       WS_EX_LAYOUTRTL = &H400000 ' Right to left mirroring
       WS_EX_COMPOSITED = &H2000000
       WS_EX_NOACTIVATE = &H8000000
   End Enum
   <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _
   Private Function SetWindowLong(ByVal hwnd As IntPtr, _
                                         ByVal nIndex As Integer, _
                                         ByVal dwNewLong As Integer) As Integer
   End Function


   <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=False)> _
   Private Function SetWindowPos(ByVal hwnd As IntPtr, _
                                        ByVal hWndInsertAfter As IntPtr, _
                                        ByVal X As Integer, _
                                        ByVal y As Integer, _
                                        ByVal cx As Integer, _
                                        ByVal cy As Integer, _
                                        ByVal wFlags As Integer) As Integer
   End Function


   <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowLongA", SetLastError:=True)> _
   Private Function GetWindowLong(ByVal hWnd As IntPtr, _
                                         <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.I4)> ByVal nIndex As Integer) As Integer
   End Function

   'Estilo de la barra de título
   Public Sub ChangeStyleBarWindow(ByVal hwnd As IntPtr, ByVal StyleBar As Integer)
       SetWindowLong(hwnd, GWL_EXSTYLE, StyleBar)
       Call SetWindowPos(hwnd, HWND_NOTOPMOST, Nothing, Nothing, Nothing, Nothing, _
       SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME)
   End Sub
End Module
#End Region




EJEMPLO DE USO


Si se aplican varias veces el mismo estilo se pueden obtener estilos curiosos.



Código (vbnet) [Seleccionar]
   Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
       For i As Integer = 0 To 5
           modChangeStyleWindow.ChangeStyleWindow(Me.Handle, WindowsStyle.WS_SYSMENU_FIXEDSINGLE, True)
       Next i
   End Sub



para modo popup:

Código (vbnet) [Seleccionar]
  modChangeStyleWindow.ChangeStyleWindow(Me.Handle, WindowsStyle.WS_POPUP, True)


Para invertir la barra de título:
Código (vbnet) [Seleccionar]
      Call modChangeStyleBar.ChangeStyleBarWindow(Me.Handle, modChangeStyleBar.WStyleBarTitle.WStB_INVERT_CAPTIONRIGHT)


Invertido y desactivado:
Código (vbnet) [Seleccionar]
  Call modChangeStyleWindow.ChangeStyleWindow(Me.Handle, modChangeStyleWindow.WindowsStyle.WS_DISABLED, True)
       Call modChangeStyleBar.ChangeStyleBarWindow(Me.Handle, modChangeStyleBar.WStyleBarTitle.WStB_INVERT_CAPTIONRIGHT)



Espero os sirva  ;)

Sl2s



Se me olvidaba, para restaurar la ventana establecer 'False'
'Activa el cambio
Código (vbnet) [Seleccionar]
Call modChangeStyleWindow.ChangeStyleWindow(Me.Handle, modChangeStyleWindow.WindowsStyle.WS_DISABLED, True)

'Desactiva el cambio (en este caso se tendría que hacer con un timer o similar ya que WS_DISABLE no permite la interacción con el form ni con los controles que contiene)
Código (vbnet) [Seleccionar]
Call modChangeStyleWindow.ChangeStyleWindow(Me.Handle, modChangeStyleWindow.WindowsStyle.WS_DISABLED, False)

sl2s
#245
Hola
Solo necesitas esto, tal cual...(Sin declaraciones API)

Código (vb) [Seleccionar]
Public Function ToKnowIfAppIsActive(strAppName As String) As Boolean
Dim IdProceso As Long
 Dim ListaProcesos  As Object
 Dim ObjetoWMI    As Object
 Dim Proceso   As Object
 Dim NameProcess As String


 Set ObjetoWMI = GetObject("winmgmts:")
If IsNull(ObjetoWMI) = False Then
 Set ListaProcesos = ObjetoWMI.InstancesOf("win32_process")
 
 For Each Proceso In ListaProcesos
       NameProcess = Proceso.Name
       IdProceso = Proceso.ProcessID
           If NameProcess = strAppName Then
               ToKnowIfAppIsActive = True
               Exit For
           Else
               ToKnowIfAppIsActive = False
           End If
   Next
End If

End Function


Por si no lo sabías te comento  que Chrome.exe es una aplicación especial. Si ejecutas el Administrador de Tareas de windows (Ctrl + R y escribe taskmgr.exe) y luego miras en la pestaña 'Procesos', verás que la lista de procesos hay más de un Chrome.exe ejecutándose.  Así que si tienes que encontrar la ventana principal debes buscar la ventana de chrome cuyo nombre de clase  (ClassName) sea "Chrome_WidgetWin_1"

sl2s
#246
Cita de: Eleкtro en 25 Noviembre 2015, 16:03 PM
Es útil, funciona muy bien hasta donde lo he testeado.

Yo uso la parte importante del código que has mostrado (función GetProcessHandle) para obtener el hwnd de la ventana principal de un proceso para cambiar la visibilidad de dicha ventana mediante la función Win32 ShowWindow.

saludos

Hola
Si te soy sincero,  como conoces Net mucho más que yo pensé mostrarías una de tus perlas usando código Net para hacer lo mismo. Por eso dejé la coletilla:

Si hay otra forma más sencilla, decídmelo

Y si no tu otro/a. XD

Claro que no me refiero a reducir el código,  sino al uso de alguna otra clase distinta a Process, u otra función.

No entiendo porqué con la clase Process sólo se obtengan los handles de unos pero de otros no.

sl2s
#247
Hola

Con lo del voltaje supongo que te refieres a subir el volumen del PC. Mírate la librería de snippets del genio Elektro que puso en este mismo foro:
libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets

Encontrarás varios relacionados con el volumen.

Yo tengo una versión de código para VB6 pero tengo  que pasarlo a Net. :-\

sl2




::) Espera... que creo que me he colado ¿voltaje de los componentes?
¿Te refieres a voltaje la 'diferencia de potencial eléctrica'? pues si es eso... puff a eso no llego

Lo malo de eso es que necesitas una compu de 'laboratorio' porque no es una cosa para ponerse experimentar con tu compu. la puedes quemar
(también se me ocurre que de poder hacerse puede usarse con malas intenciones  :¬¬)

Quizás te interese esto:
http://foro.elhacker.net/hardware/programas_imprescindibles-t39488.0.html

Funciones de administración de energía
#248
.NET (C#, VB.NET, ASP) / Importar APIs
24 Noviembre 2015, 00:45 AM
Hola

///IMPORTAR APIs///
Quiero compartir esta código curioso para importar APIs de librerías DLL y de aplicaciones. Es muy útil.

Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim DialogoAbrir As New System.Windows.Forms.OpenFileDialog
       DialogoAbrir.Title = "Abrir..."
       DialogoAbrir.FilterIndex = 1
       DialogoAbrir.Filter = "*.dll|*.dll|*.exe|*.exe"
       DialogoAbrir.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
       If DialogoAbrir.ShowDialog() = DialogResult.OK Then
ImportAPI(DialogoAbrir.FileName)
       End If

       

   End Sub
   Sub ImportAPI(ByVal Path_Dll As String)

       '//VB6
       'Dim Path_Link As String = DirProgramFiles & "\Microsoft Visual Studio\VB98\link.exe"

       '****IMPORTANTE****:
       '//VB2010
       'link.exe se encuentra en:
       'C:\Archivos de programa\Microsoft Visual Studio 10.0\VC\bin\
       'Tiene dependencia con 'mspdb100.dll' que se encuentra en:
       'C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE
       'Haz una copia de link.exe en  ...\Common7\IDE de lo contrario dará error al no encontrar 'mspdb100.dll'

       '//VS2012 64bits
       'link.exe se encuentra en:
       'C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
       'mspdb100.dll' se encuentra en:
       'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE

       Dim DirProgramFiles As String

       If Environment.Is64BitOperatingSystem Then
           DirProgramFiles = (Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86))
       Else
           DirProgramFiles = (Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles))
       End If

       Dim Path_Link As String  = (DirProgramFiles & "\Microsoft Visual Studio 10.0\Common7\IDE\link.exe")
       Dim FileTemp As String = System.IO.Path.GetTempFileName     'Crea un archivo temporal
       Dim C34 As String = Convert.ToChar(34)

       'Linea de comandos para link.exe
       Dim StartLink As String = String.Format("{0}{1}{2} /dump /exports {3}{4}{5} /out:{6}{7}{8}", _
                                               C34, Path_Link, C34, _
                                               C34, Path_Dll, C34, _
                                               C34, FileTemp, C34)
       Try
           'Ejecuta link.exe
           Dim myProcess As New Process()
           myProcess.StartInfo.UseShellExecute = False
           myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
           myProcess.StartInfo.FileName = StartLink
           myProcess.StartInfo.CreateNoWindow = True
           myProcess.Start()
       Catch ex As Exception
           MessageBox.Show("No se encuentra link.exe")
       End Try


        Me.Cursor = Cursors.WaitCursor
       System.Threading.Thread.Sleep(2000)
       Me.Cursor = Cursors.Default

       Dim strBuffer As New System.IO.StreamReader(FileTemp)
       TextBox1.Text = strBuffer.ReadToEnd
       strBuffer.Close()
       FileIO.FileSystem.DeleteFile(FileTemp)

   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub
End Class


Sl2





El método también se puede usar para obtener información a través de aplicaciones que usen comandos

Este ejemplo obtiene es el resultado de hacer: ping www.google.es

Código (vbnet) [Seleccionar]

Public Class Form1

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub


   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net")
       TextBox1.Text = GetResultCommand(sCommand)
   End Sub

#Region "GetResultCommand"
   Public Function GetResultCommand(ByVal sCommandLine As String) As String
       Dim FileTemp As String = System.IO.Path.GetTempFileName     'Crea un archivo temporal
       Dim C34 As String = Convert.ToChar(34)
       Dim Result As String = Nothing


       sCommandLine = String.Format(sCommandLine & "{0}{1}{2}", C34, FileTemp, C34)


       Try
           Dim myProcess As New Process()
           With myProcess
               .StartInfo.UseShellExecute = False
               .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
               .StartInfo.FileName = sCommandLine
               .StartInfo.CreateNoWindow = True
               .Start()
           End With

       Catch ex As Exception
           MessageBox.Show(ex.Message)
       End Try

       Me.Cursor = Cursors.WaitCursor
       System.Threading.Thread.Sleep(2000)

       Dim FileAccesible As Boolean = False
       While FileAccesible = False
           Try
               Dim strBuffer As New System.IO.StreamReader(FileTemp, System.Text.Encoding.GetEncoding("ibm850"))
               Result = strBuffer.ReadToEnd()
               FileAccesible = True
               strBuffer.Close()

           Catch ex As Exception
               FileAccesible = False
           End Try
            My.Application.DoEvents()
       End While
       Me.Cursor = Cursors.Default
       FileIO.FileSystem.DeleteFile(FileTemp)
       Return Result
   End Function
#End Region
End Class


Mediante este...snippet, supongo. Se obtendría el resultado de una línea de comandos que usáramos en la consola de windows:


Código (vbnet) [Seleccionar]
GetResultCommand(LÍNA DE COMANDO)

Es importante poner entre comillas la aplicación a la que llamamos:
""cmd.exe""

Código (vbnet) [Seleccionar]
Dim sCommand As String = String.Format("""cmd.exe"" /r ping {0} ", "www.elhacker.net")

para menos lío también se puede llamar así:

Código (vbnet) [Seleccionar]
Dim sCommand As String = String.Format("""{0}"" /r ping {1} ", "cmd.exe", "www.elhacker.net")

el caso es que la aplicación quede entre comillas.

[MODIFICACADO]
Bueno, he hecho una pequeña modificación porque me he dado cuenta que claro, no todas las aplicaciones con comandos tienen el mismo comando de salida. Por ejemplo link.exe tiene /out: y cmd.exe tiene '>'. Así que esto es mejor aplicarlo cuando establecemos el comando y no desde el snippet

Con lo cual quedaría así con link.exe:
Código (vbnet) [Seleccionar]
     Dim sCommand As String = String.Format("""{0}"" /dump /exports {1} /out:", _
"C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE\link.exe", _
   "c:\windows\system32\shell32.dll")
       TextBox1.Text = GetResultCommand(sCommand)


o así en con cmd.exe:
Código (vbnet) [Seleccionar]
  Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net")
       TextBox1.Text = GetResultCommand(sCommand)


Y he modificado esta línea quitando '>':

Código (vbnet) [Seleccionar]
sCommandLine = String.Format(sCommandLine & "{0}{1}{2}", C34, FileTemp, C34)

También he añadido:
Código (vbnet) [Seleccionar]
System.Text.Encoding.GetEncoding("ibm850")

Que no se en otra compu, pero en la mía si no establezco esta codificación para leer el archivo no se ven correctamente las vocales con acento.

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



         ALGUNOS COMANDOS INTERESANTES PARA OBTENER INFORMACIÓN
       Dim sCommand As String = String.Format("""{0}"" /r dir C: >", "cmd.exe")
         
    Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net")
   
   Para mostrar todo el contenido de la tabla de rutas IP
   Dim sCommand As String = String.Format("""{0}"" /r route print >", "cmd.exe")

     Muestra la configuración de TCP/IP completa de todos los adaptadores
       Dim sCommand As String = String.Format("""{0}"" /r ipconfig /all >", "cmd.exe")


       Muestra una lista de todos los controladores de dispositivo instalados y sus propiedades.
       [modo tabla]
       Dim sCommand As String = String.Format("""{0}"" /r driverquery >", "cmd.exe")
       [modo csv]
       Dim sCommand As String = String.Format("""{0}"" /r driverquery /fo csv >", "cmd.exe")


       Muestra los archivos en lista donde se ejecuta esta apliación
       Dim sCommand As String = String.Format("""{0}"" /r tree /f >", "cmd.exe")

       Muestra todos los archivos del directorio C: (puede tardar un poco según el disco)
       Dim sCommand As String = String.Format("""{0}"" /r tree c:\ /f >", "cmd.exe")


       [Este es muy buen comando]
       Muestra información de configuración detallada acerca de un equipo y su sistema operativo
       (puedes usar 'csv' o 'list' en lugar de 'table'
   Dim sCommand As String = String.Format("""{0}"" /r systeminfo /fo table >", "cmd.exe")
       
   Para obtener información de un determinado host (sistema)
       comando= 'systeminfo /s HOST /fo table'
       Para(obtener) 'HOST'  escribe hostname en la consola y luego lo incorporas en el siguente
       comando, en este caso es 'mypc'
       Dim sCommand As String = String.Format("""{0}"" /r systeminfo /s mypc /fo table >", "cmd.exe")

       Muestra una lista de los servicios que se están ejecutando
Dim sCommand As String = String.Format("""{0}"" /r Net start  >", "cmd.exe")

       Muestra las conexiones activas
       Dim sCommand As String = String.Format("""{0}"" /r netstat >", "cmd.exe")

       Muestra todas las conexiones y puertos de escucha
       'Dim sCommand As String = String.Format("""{0}"" /r netstat -a >", "cmd.exe")

       Muestra el ejecutable que crea cada conexión o puerto de(escucha)
       Dim sCommand As String = String.Format("""{0}"" /r netstat -b >", "cmd.exe")

       Muestra las estadísticas Ethernet. Se puede combinar con la opción()-s
       Dim sCommand As String = String.Format("""{0}"" /r netstat -e >", "cmd.exe")

       Muestra estadísticas por protocolo. De forma predeterminada,
       se muestran para IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP y
       UDPv; se puede utilizar la opción -p para especificar un
       subconjunto de los valores predeterminados
       Dim sCommand As String = String.Format("""{0}"" /r netstat -s >", "cmd.exe")


       CONSEJO:
       'ALGUNOS COMANDOS PERMITEN USAR TRES TIPOS DE LISTA [LIST|CSV|TABLE]
       usando CSV puedes acceder fácilmente a la información usando SPLIT
       MODO CSV: "infoA","InfoB","infoC","InfoD"
       Ejemplo:
       Devuelve la dirección de control de acceso a medios (MAC, media access control) y  lista de los protocolos de red asociados con cada la dirección de todas las tarjetas de red de cada equipo
       Dim sCommand As String = String.Format("""{0}"" /r getmac  /fo csv /nh /v >", "cmd.exe")
       Dim sCommand As String = String.Format("""{0}"" /r getmac  /s mypc /fo csv >", "cmd.exe")


Espero que os sirva

sl2  :D



[condejo]
Para un TextBox u otro control de texto usa la fuente Courier New para que las tablas se muestren de forma ordenada.
#249
Hola

Te da error  porque el directorio no existe . Primero debes crear el directorio:

Código (csharp) [Seleccionar]
Directory.CreateDirectory(MyDir)

Para añadir texto a un archivo ya creado debes usar AppendAllText (si no hay archivo lo crea):

Código (csharp) [Seleccionar]
File.AppendAllText(FilePath, ContentFile)

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       // Variable.    
       string Variable = "Esto es una prueba ";        
       string contenido = string.Format("{0:dd/MM/yyyy HH:mm} ", DateTime.Now);
       private void Form1_Load(object sender, EventArgs e)
       {

       }

       private void button1_Click(object sender, EventArgs e)
       {
           richTextBox1.Text = Variable + contenido;
       }

       private void button2_Click(object sender, EventArgs e)        
       {   string sDirectory = @"C:\Carpeta";
           string NameFile = "NombreArchivo.txt";
           string FilePath = string.Format("{0}\\{1}", sDirectory, NameFile);
           string sAddLine = string.Format("{0}{1}{2}", Variable, contenido, Environment.NewLine);
               
           //Si el directorio no existe entonces lo crea
           if (Directory.Exists(sDirectory).Equals(false))
           {
               Directory.CreateDirectory(sDirectory);
           }        
           //Escribe en el archivo      
           File.AppendAllText(FilePath, sAddLine);
           //File.WriteAllText(String.Format("{0}\\{1}", sDirectory, NameFile), Variable + contenido)
           //File.WriteAllText("nombrearch.txt", Variable & contenido)
       }      
   }    
}






#250
Hola

Iré al grano, utilizando la función Process.GetProcesses() puedo obtener información del los procesos del sistema así como el Handle o el MainWindowHandle de la ventana principal de un proceso.

El problema es que en algunos casos  MainWindowHandle  devuelve 0

Recordé un viejo código de VB que tenía por ahí. Y tras un buen rato probando lo conseguí pasar a VB.NET, ya que usa APIs y si no se usa bien devuelve error o valores nulos.

Se necesita el ID de un proceso para obtener el handle principal, y dado que la clase  Process no devuelve valor nulo con los IDs obtengo todos los Handles en la lista.


Ahí va el code  ;):

////OBTENER HANDLE PROCESO////

Código (vbnet) [Seleccionar]
#Region "Obtener Handle Proceso"
Public Module modProcessHandle
   <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
   Private Function FindWindow(ByVal lpClassName As String, _
   ByVal lpWindowName As String) As IntPtr
   End Function
   <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
   Public Function GetParent(ByVal hWnd As IntPtr) As IntPtr
   End Function
   <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
   Private Function GetWindow(ByVal hWnd As IntPtr, _
   ByVal wCmd As Integer) As IntPtr
   End Function
   <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
   Private Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
   ByRef lpdwProcessId As Integer) As IntPtr
   End Function


   Public Function GetProcessHandle(ByVal ProcessId As Integer) As IntPtr
       Dim HwndTemporal As IntPtr
       Dim idProc As Integer = 0
       Dim HWND As IntPtr = IntPtr.Zero
       Const GW_HWNDNEXT = 2
       HwndTemporal = FindWindow(Nothing, Nothing)
       ' Loop hasta que encuentra una coincidencia o no hay más identificadores de ventana:
       Do Until HwndTemporal = IntPtr.Zero
           ' Comprueba que no tenga ninguna ventana 'Parent'
           If GetParent(HwndTemporal) = IntPtr.Zero Then
               GetWindowThreadProcessId(HwndTemporal, idProc)
               If ProcessId.Equals(idProc) Then
                   HWND = HwndTemporal 'Devuelve el handle encontrado
                   Return HWND
                   Exit Do ' Salir de bucle
               End If
           End If
           idProc = 0
           'Siguiente identificador de ventana
           HwndTemporal = GetWindow(HwndTemporal, GW_HWNDNEXT)
       Loop
       Return HWND
   End Function

End Module
#End Region



Aquí un ejemplo de como usarlo para obtener una lista con los procesos en ejecución sus handles y su Class Name.


Código (vbnet) [Seleccionar]
Option Strict On
Option Explicit On
Imports System.Runtime.InteropServices
Imports System.Text

Public Class Form1
   <DllImport("user32.dll", CharSet:=CharSet.Auto)>
   Private Shared Function GetClassName(ByVal hWnd As IntPtr, _
  ByVal lpClassName As System.Text.StringBuilder, _
  ByVal nMaxCount As Integer) As Integer
   End Function
   Dim ClassName As StringBuilder = New StringBuilder(256)
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       ListView1.Columns.Add("Name", 100)
       ListView1.Columns.Add("MainHandle", 100)
       ListView1.Columns.Add("ClassName", 200)
       ListView1.Columns.Add("MainHandle", 100)
       ListView1.Columns.Add("ClassName", 200)
       ListView1.View = View.Details
       ListView1.FullRowSelect = True
       'Recorre los procesos y agrega la información al ListView
       For Each Proceso In Process.GetProcesses()
           Dim Handle As IntPtr = modProcessHandle.GetProcessHandle(Proceso.Id)
           If Handle <> IntPtr.Zero Then
               'Nombre Proceso
               ListView1.Items.Add(Proceso.ProcessName)

               'MainWindowHandle
               ListView1.Items(ListView1.Items.Count - 1).SubItems.Add _
                   (Conversion.Hex(Proceso.MainWindowHandle.ToInt32))
               'ClassName
               ClassName.Clear()
               GetClassName(CType(Proceso.MainWindowHandle.ToInt32, IntPtr), ClassName, ClassName.Capacity)
               ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(ClassName.ToString)

               'MainWindowHandle
               ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(Conversion.Hex(CInt(Handle)))
               'ClassName
               ClassName.Clear()
               GetClassName(Handle, ClassName, ClassName.Capacity)
               ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(ClassName.ToString)

           End If
       Next
   End Sub

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub
End Class
#Region "Obtener Handle Proceso"
Public Module modProcessHandle
   <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
   Private Function FindWindow(ByVal lpClassName As String, _
   ByVal lpWindowName As String) As IntPtr
   End Function
   <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
   Public Function GetParent(ByVal hWnd As IntPtr) As IntPtr
   End Function
   <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
   Private Function GetWindow(ByVal hWnd As IntPtr, _
   ByVal wCmd As Integer) As IntPtr
   End Function
   <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
   Private Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
   ByRef lpdwProcessId As Integer) As IntPtr
   End Function


   Public Function GetProcessHandle(ByVal ProcessId As Integer) As IntPtr
       Dim HwndTemporal As IntPtr
       Dim idProc As Integer = 0
       Dim HWND As IntPtr = IntPtr.Zero
       Const GW_HWNDNEXT = 2
       HwndTemporal = FindWindow(Nothing, Nothing)
       ' Loop hasta que encuentra una coincidencia o no hay más identificadores de ventana:
       Do Until HwndTemporal = IntPtr.Zero
           ' Comprueba que no tenga ninguna ventana 'Parent'
           If GetParent(HwndTemporal) = IntPtr.Zero Then
               GetWindowThreadProcessId(HwndTemporal, idProc)
               If ProcessId.Equals(idProc) Then
                   HWND = HwndTemporal 'Devuelve el handle encontrado
                   Return HWND
                   Exit Do ' Salir de bucle
               End If
           End If
           idProc = 0
           'Siguiente identificador de ventana
           HwndTemporal = GetWindow(HwndTemporal, GW_HWNDNEXT)
       Loop
       Return HWND
   End Function

End Module
#End Region



Como demostración he hecho que se muestre en una columna los handles obtenidos con la clase Process y otra columna con los handles obtenidos con el snippet. Se puede ver que con algunos procesos ocultos, es decir no son visibles, se devuelve valor 0, pero con el snippet se obtiene el handle sin problemas. Además se obtienen los nombres de clase (ClassName) que sin los Handles de las ventanas no es posible obtenerlos. Por lo menos que yo sepa.

La primera columna ClassName se obtiene con MainWindowHandle del Procces. La segunda columna ClassName se obtiene con los handles obtenidos con el snippet.


Si hay otra forma más sencilla, decídmelo  :-*


El código original VB6 está en el siguiente enlace:
CodeVB

Espero que os sirva...

Saludos