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?
Si, con el api sendmessage... buscas el hwnd del boton por ejemplo y le envias mousedown y mouseup y asi generas un click!
saludos
pues si, como te dijeron, busca los mensajes correspondientes a los clicks y se los pasas...antes busca el hwnd con apis tambien..
saludos.
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?
'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
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 ;D
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
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
;)
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
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
Cita de: Dessa en 19 Enero 2009, 16:38 PM
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
eso iva a escribir usar el findWindows para obtener la ventana a manipular, :P :P
Muchas Gracias la ayuda :D
Hola a todos el tema me parecio muy interesante... podrian explicar un poco mas sobre las funciones FindWindows para obtener el Hwnd de la ventana y FindWindowsEx :huh:
gracias saludos
Cita de: fabricioAngel en 10 Febrero 2009, 13:54 PM
Hola a todos el tema me parecio muy interesante... podrian explicar un poco mas sobre las funciones FindWindows para obtener el Hwnd de la ventana y FindWindowsEx :huh:
gracias saludos
chequea este post que habia respondido..
Ayuda con el parametro de esta API? (http://foro.elhacker.net/programacion_vb/ayuda_con_el_parametro_de_esta_api-t208847.0.html;msg992360#msg992360)
saludos.
Hola a todos les cuento lo que qiero hacer para que puedas ayudarme... necesito formatear un pen drive con VB 6 sin interaccion del usuario tengo una idea de las apis que hay que usar pero como no se mucho de programacion se me complica
se me ocurrio manejar la ventana de windows Dar fomato pero no se como hacer para manejarla en forma oculta y apretar el boton iniciar poor codigo tambien voy a tener que apretar el boton aceptar cuando me pida confirmacion de que se van a borrar los datos :huh:
pyeden ayudarme
muchas gracias su tu tiempo
saludos
Cita de: fabricioAngel en 11 Febrero 2009, 13:17 PM
Hola a todos les cuento lo que qiero hacer para que puedas ayudarme... necesito formatear un pen drive con VB 6 sin interaccion del usuario tengo una idea de las apis que hay que usar pero como no se mucho de programacion se me complica
se me ocurrio manejar la ventana de windows Dar fomato pero no se como hacer para manejarla en forma oculta y apretar el boton iniciar poor codigo tambien voy a tener que apretar el boton aceptar cuando me pida confirmacion de que se van a borrar los datos :huh:
pyeden ayudarme
muchas gracias su tu tiempo
saludos
Eso es lo que hace el code que puse en tu post :¬¬
Haz el favor de hacer las preguntas en su lugar correspondiente...
Saludos ;D
amigo hacktor, tengo una pregunta, como lograstes hacerlo, no he podido enviar intrucciones de pulsacion de tecla, solo logro de pulsaciones del mouse, como puedo enviar la pulsacion por ejemplo del insert, con el sendmessage, para enviar la a hago esto:
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Call SendMessage(ret, WM_KEYDOWN, 65, 0)
Call SendMessage(ret, WM_KEYUP, 65, 0)
y nada, no digan que mi ret esta malo por que eso no es. ayudame pls.