Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: 70N1 en 1 Marzo 2010, 15:11 pm



Título: Presionar boton de un programa externo. ( VB. Net )
Publicado por: 70N1 en 1 Marzo 2010, 15:11 pm
Necesito ejecutar un programa externo algo como process.start pero luego quiero presionar un boton que contiene el programa.

Necesito algo de informacion al respecto.
Cualquier comentario es bienvenido.


Título: Re: Presionar boton de un programa externo. ( VB. Net )
Publicado por: elmaro en 1 Marzo 2010, 16:45 pm
Para hacer eso tenes que saber el handle del botón que quieres presionar. Y enviarle con SendMessage "un click"

Acá tienes el código del SendMessage:
Código
  1.    <System.Runtime.InteropServices.DllImport("user32.DLL")> _
  2.    Public Function SendMessage( _
  3.            ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
  4.            ByVal wParam As Integer, ByVal lParam As Integer _
  5.            ) As Integer
  6.    End Function
  7.  
  8.    <System.Runtime.InteropServices.DllImport("user32.DLL")> _
  9. Public Function SendMessage( _
  10.        ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _
  11.        ByVal wParam As Integer, ByVal lParam As String _
  12.        ) As Integer
  13.    End Function

Para buscar el handle del boton puedes instalarte WinID (asi sabes como buscarlo desde la aplicacion)

Seguramente te sirvan todas estas funciones:
Código
  1. <System.Runtime.InteropServices.DllImport("user32.dll", _
  2.    EntryPoint:="FindWindow")> _
  3.    Public Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
  4.    End Function
  5.  
  6.    <System.Runtime.InteropServices.DllImport("user32.dll")> _
  7.    Public Function EnumChildWindows(ByVal hWndParent As System.IntPtr, ByVal lpEnumFunc As EnumWindowsProc, ByVal lParam As Integer) As Boolean
  8.    End Function
  9.  
  10.    Public Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
  11.        Dim ChildrenList As New List(Of IntPtr)
  12.        Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
  13.        Try
  14.            EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
  15.        Finally
  16.            If ListHandle.IsAllocated Then ListHandle.Free()
  17.        End Try
  18.        Return ChildrenList.ToArray
  19.    End Function
  20.  
  21.    Private Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
  22.        Dim ChildrenList As List(Of IntPtr) = GCHandle.FromIntPtr(Parameter).Target
  23.        If ChildrenList Is Nothing Then Throw New Exception("GCHandle Target could not be cast as List(Of IntPtr)")
  24.        ChildrenList.Add(Handle)
  25.        Return True
  26.    End Function
  27.  
  28.    <System.Runtime.InteropServices.DllImport("user32.dll")> _
  29.    Public Sub GetClassName(ByVal hWnd As System.IntPtr, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer)
  30.        ' Leave function empty    
  31.    End Sub

Lo que no se es cual es la constante a enviar. Quedaría buscar por ahí

Saludos


Título: Re: Presionar boton de un programa externo. ( VB. Net )
Publicado por: 70N1 en 1 Marzo 2010, 17:59 pm
Muchas gracias. Yo me imaginava que era algo de sendmessage o sendkey, aunque con sendmessage es mejor ya que no keda tan chapuza. Voy a trabajar con los codigos que me as proporcionado. muchas gracias.


Título: Re: Presionar boton de un programa externo. ( VB. Net )
Publicado por: elmaro en 1 Marzo 2010, 18:23 pm
Viendo por ahi creo que esta es la constante


Código
  1. Private Const BM_CLICK = &HF5


Título: Re: Presionar boton de un programa externo. ( VB. Net )
Publicado por: m[a]rkus en 20 Abril 2010, 00:59 am
Hola, mira tengo un problema que necesito saber el hwnd de una sub-ventana, o sea ya tome la hwnd de la principal con Findwindows, y ahora con FindwindowsEX en teoria deberia tomar la que quiero, pero al parecer ahí otra ventana mas por medio, entonces necesito listar las ventanas hijas, ahí una API pero no la entiendo, con Spy++ ya eh mirado y no veo ni siquiera el que yo quiero a menos que lo haga con la "mirilla" y con el WINID que dijo sebasneo123 no salen las ventanas hijas, alguna idea ? gracias