Enviar Instrucciones a una ventana

Iniciado por Xephiro, 19 Enero 2009, 07:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Xephiro

Una pequeña pregunta xD es posible enviar instrucciones a una ventana, sin tener que tenerla visible?


Por ejemplo, que presione un boton X de la ventana MiPrograma, pero sin tener que visualizarla para que no me interfiera con lo que hago?

el_c0c0

Si, con el api sendmessage... buscas el hwnd del boton por ejemplo y le envias mousedown y mouseup y asi generas un click!

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

seba123neo

#2
pues si, como te dijeron, busca los mensajes correspondientes a los clicks y se los pasas...antes busca el hwnd con apis tambien..

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Xephiro

Gracias por la ayuda, pero ahora otra preguntita mas :D


Como es posible detectar los nombres de Botones, ComboBox, TextBox, ETC de las  aplicaciones que quiero manipular con sendmessage?

Dessa

#4
'Estas 2 funciones obtienen el Caption de la ventana o control
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
    ByVal hwnd As Long, _
    ByVal lpString As String, _
    ByVal cch As Long) As Long

' Retorna la cantidad de caracteres del caption de la ventana

Private Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long




Option Explicit

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal Hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal Hwnd As Long) As Long

Private Sub Form_Load()
Me.Caption = "Nombre de ventanas o controles"
End Sub

Private Sub Command1_Click()
Dim nombre As String
nombre = String(GetWindowTextLength(Me.Hwnd), Chr$(0))
Call GetWindowText(Me.Hwnd, nombre, 100)
MsgBox nombre
End Sub



Saludos
Adrian Desanti

Karcrack

Para obtener el tipo de control no se usa GetWindowText, sino GetClassName...

Ejemplo:
Código (vb) [Seleccionar]

Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Function GetWinClassName(ByVal hwnd As Long) As String
    Dim lLength         As Long
   
    'Creamos el buffer
    GetWinClassName = String$(260, Chr$(0))
    'Llamamos al API
    lLength = GetClassName(hwnd, GetWinClassName, Len(GetWinClassName))
    'Recortamos el buffer
    GetWinClassName = Left$(GetWinClassName, lLength)
End Function

En caso de ser un TreeView el resultado es: SysTreeView32
Si es un ListView: SysListView32
Si es un boton: Button

Y otros muchos mas....

Saludos ;D

Dessa

Cita de: Hacktor en 19 Enero 2009, 14:38 PM
Gracias por la ayuda, pero ahora otra preguntita mas :D


Como es posible detectar los nombres de Botones, ComboBox, TextBox, ETC de las  aplicaciones que quiero manipular con sendmessage?

Karcrack , quiere saber el nombre de los controles, no la clase

GetWindowText, no GetClassName
Adrian Desanti

Dessa

#7


Option Explicit

Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI: x As Long: y As Long: End Type

Private Sub Form_Load(): Timer1.Interval = 100: End Sub

Private Sub Timer1_Timer()

Call SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, &H2 Or &H1)

Dim Cor As POINTAPI: Dim retorno As Long: retorno = GetCursorPos(Cor)
Dim Handle As Long: Handle = WindowFromPoint(Cor.x, Cor.y)

Dim nombre As String: nombre = String(GetWindowTextLength(Handle), Chr$(0))
Call GetWindowText(Handle, nombre, 100)

Dim ClassName As String: ClassName = Space(256)
Dim ret As Long: ret = GetClassName(Handle, ClassName, 256)
ClassName = Left$(ClassName, ret)


Me.Cls: Me.Print "Nombre control: " & nombre: Me.Print "Nombre Classe: " & ClassName


End Sub





Hacktor, solo pasá el puntero del mouse por donde quieras
;)
Adrian Desanti

Xephiro

Una pregunta, pero tanto GetWindowText como GetClassName pueden tomar los datos de un programa como por ejemplo un juego o una aplicacion externa a mi programa?

lo que pasa es que quiero saber el nombre de Texbox y Botones de otra aplicacion para que con SendMessage pueda enviarle instrucciones

Dessa

Vamos por partes, primero FindWindows para obtener el Hwnd de la ventana, segundo FindWindowsEx para obtener el Hwnd del boton, caja de texto, etc, y tercero con este Hwnd y SendMessage mandas las intrucciones, si analisas el último codigo que te puse te puede facilitar la tarea.

Saludos

Adrian Desanti