Autor
|
Tema: Enviar Instrucciones a una ventana (Leído 5,137 veces)
|
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?
|
|
|
En línea
|
|
|
|
el_c0c0
Desconectado
Mensajes: 307
|
Si, con el api sendmessage... buscas el hwnd del boton por ejemplo y le envias mousedown y mouseup y asi generas un click!
saludos
|
|
|
En línea
|
'- coco "Te voy a romper el orto"- Las hemorroides
|
|
|
seba123neo
|
pues si, como te dijeron, busca los mensajes correspondientes a los clicks y se los pasas...antes busca el hwnd con apis tambien..
saludos.
|
|
« Última modificación: 19 Enero 2009, 08:05 am por seba123neo »
|
En línea
|
|
|
|
Xephiro
|
Gracias por la ayuda, pero ahora otra preguntita mas Como es posible detectar los nombres de Botones, ComboBox, TextBox, ETC de las aplicaciones que quiero manipular con sendmessage?
|
|
|
En línea
|
|
|
|
Dessa
Desconectado
Mensajes: 624
|
'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
|
|
« Última modificación: 19 Enero 2009, 15:55 pm por Dessa »
|
En línea
|
Adrian Desanti
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Para obtener el tipo de control no se usa GetWindowText, sino GetClassName... Ejemplo: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
|
|
|
En línea
|
|
|
|
Dessa
Desconectado
Mensajes: 624
|
Gracias por la ayuda, pero ahora otra preguntita mas 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
|
|
|
En línea
|
Adrian Desanti
|
|
|
Dessa
Desconectado
Mensajes: 624
|
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
|
|
« Última modificación: 19 Enero 2009, 16:17 pm por Dessa »
|
En línea
|
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
|
|
|
En línea
|
|
|
|
Dessa
Desconectado
Mensajes: 624
|
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
|
|
|
En línea
|
Adrian Desanti
|
|
|
|
|