|
371
|
Programación / Programación Visual Basic / Interceptar Click "ajenos" con SendMessage (Ejemplo)
|
en: 20 Enero 2009, 01:42 am
|
Este es un simple ejemplo de como interceptar Clcks en botones de una aplicación externa, en este caso la calculadora de windows XP (en vista y seven hay que cambiar las clases) usando la constante BM_GETSTATE para SendMessage cuyo valor de retorno es de 512 si el button recibe un click, retorno de 620 si el button tiene el foco y retono 0 si no tiene foco, son retornos "especiales" para la calculadora ya que los retornos de casi todos los button de otras aplicaciones son de 44 si reciben el click o de 108 si el click se provoca con la barra espaciadora. se pueden saber los retornos con: MsgBox SendMessage(Hndl, BM_GETSTATE, 0, 0) otras constantes para aprovechar Private Const BM_GETSTATE = &HF2 Private Const WM_SETFOCUS = &H7 Private Const WM_KILLFOCUS = &H8 Private Const WM_ENABLE = &HA Option Explicit
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 GetTickCount Lib "kernel32" () As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const BM_GETSTATE = &HF2
Private Sub Form_Load() ' cierro las calculadodas abiertas While FindWindow("SciCalc", vbNullString) <> 0 Call SendMessage(FindWindow("SciCalc", vbNullString), &H112, &HF060&, 0) Wend Shell "calc" Timer1.Interval = 100 End Sub
Private Sub Form_Unload(Cancel As Integer) ' cierro las calculadodas abiertas While FindWindow("SciCalc", vbNullString) <> 0 Call SendMessage(FindWindow("SciCalc", vbNullString), &H112, &HF060&, 0) Wend End Sub
Private Sub Form_DblClick() Shell "calc" End Sub
Private Sub Timer1_Timer()
Call SetWindowPos(Me.hwnd, -1, 0, 0, 0, 0, &H2 Or &H1)
Dim Hndl As Long: Dim i As Long: Dim x As Long Dim H(0 To 9) As Long: Dim ch(0 To 9) As Long
Hndl = FindWindow("scicalc", vbNullString) If Hndl <> 0 Then For i = 0 To 9 H(i) = FindWindowEx(Hndl, 0, vbNullString, i) ch(i) = SendMessage(H(i), BM_GETSTATE, 0, 0) If ch(i) = 512 Then Me.Cls: Me.Print "FOCO BOTON " & i If ch(i) = 620 Then Me.Cls: Me.Print "CLICK EN BOTON " & i x = GetTickCount: While GetTickCount < x + 450: DoEvents: Wend End If DoEvents Next i If ch(0) = 0 And ch(1) = 0 And ch(2) = 0 And ch(3) = 0 And ch(4) = 0 _ And ch(5) = 0 And ch(6) = 0 And ch(7) = 0 And ch(8) = 0 And ch(9) = 0 _ Then Me.Cls: Me.Print "NINGUN BOTON NUMÉRICO TIENE FOCO" Else Me.Cls: Me.Print "CALCULADORA CERRADA" End If
End Sub
Saludos
|
|
|
372
|
Programación / Programación Visual Basic / Re: Enviar Instrucciones a una ventana
|
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
|
|
|
373
|
Programación / Programación Visual Basic / Re: Enviar Instrucciones a una ventana
|
en: 19 Enero 2009, 16:15 pm
|
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
|
|
|
374
|
Programación / Programación Visual Basic / Re: Enviar Instrucciones a una ventana
|
en: 19 Enero 2009, 16:03 pm
|
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
|
|
|
375
|
Programación / Programación Visual Basic / Re: Enviar Instrucciones a una ventana
|
en: 19 Enero 2009, 15:31 pm
|
'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
|
|
|
376
|
Programación / Programación Visual Basic / Re: Detect Jmp
|
en: 18 Enero 2009, 01:21 am
|
Una pregunta, este foro no es español, que se yó , simpre me pareció partició una falta de respeto participar en un foro con idioma "cambiado", pero deben ser "películas" mías.
Saludos
|
|
|
380
|
Programación / Programación Visual Basic / Re: Windows7 (Beta1) y VB 6.0
|
en: 11 Enero 2009, 22:53 pm
|
- NOTICIAS ENERO DE 2009 - 11-01-09 Microsoft ha levantado el límite de 2.5 millones de descargas para la beta de Windows 7 El 9 de enero Microsoft publicó la beta de forma oficial para las primeras 2.5 millones personas que accedieran al enlace de descarga. Muchas personas quisieron descargar, y los servidores se saturaron, dejando a muchos sin su copia del sistema operativo. Microsoft, con buen criterio, levantó el límite para que cualquiera pueda descargar su copia de Windows 7 Beta sin problemas y sin limitaciones hasta el 24 de enero. Los enlaces de descarga directa los teneis en las noticias del 10/01/09. Claves de activación para Windos 7 beta 1 para todos los que habeis descargado la beta 1 de Windows 7, y para los que pensais descargarlos os dejo unas cuantas claves facilitadas por Microsoft para activar la beta 1 hasta agosto de 2009Estos datos y las claves de activación figuran en el siguiente sitio en las noticias del día 11/01/2009 http://www.mundowindows.com/'--------------------------------------------------------------- '--------------------------------------------------------------- '--------------------------------------------------------------- EDIT: Activé perfectamente con una de esas claves '--------------------------------------------------------------- '--------------------------------------------------------------- '---------------------------------------------------------------
|
|
|
|
|
|
|