Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Cromatico en 14 Octubre 2012, 17:04 pm



Título: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 14 Octubre 2012, 17:04 pm
Hola que tal tanto tiempo gente, estoy clavado con un temita y es extraño lo que me pasa, seguramente algo estoy haciendo mal, la verdad no lo se... Cuestion lo que intento hacer es simular un simple click en un control picturebox externo, con api sendmessage, ojo ahora para hacer pruebas estoy probando con dos proyectos mios, uno tiene una picturebox que en el evento click manda un msgbox, y el otro proyecto es el que intenta clickear ese image...

Si yo mantengo apretado el click del mouse sobre cualquier lugar de la pantalla, sea o no alguno de los dos proyectos, me salta el msgbox, pero la idea seria que clicke automaticamente la imagen sin hacer nada con el mouse... El codigo es:

Código:
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
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

timer:
HWNDx = Text3.Text
Call SendMessage(HWNDx, WM_LBUTTONDOWN, 0, ByVal 0&)
Call SendMessage(HWNDx, WM_LBUTTONUP, 0, ByVal 0&)

Alguna idea de por que no envia correctamente el click? otra cosa, paara que clickee en el centro de ese control, tendria que usar getwindowrect, calcular el width y height y luego convertirlo verdad? Algo vi por algun lado pero no recuerdo! Igual el tema principal por ahora es que haga click como corresponde!

Muchas gracias!


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 17 Octubre 2012, 19:39 pm
Actualizo un dato, si agrego el evento DOBLE CLICK en el proyecto que tiene el picturebox, y uso sendmessage con WM_LBUTTONDBLCLK, funciona pero va al evento doble click del picture obviamente.... No entiendo por que no funciona si quiero hacer solo un click, es decir, WM_LBUTTONDOWN y WM_LBUTTONUP...

Gracias!


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Dessa en 17 Octubre 2012, 23:16 pm
Hola Cromático, si querés un solo Click (usando los mensajes WM_LBUTTONDOWN y WM_LBUTTONUP)  probá con los eventos MouseDown o MouseUp, saludos



Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 18 Octubre 2012, 00:33 am
pero te referis al mouse_event? se puede hacer con sendmessage? osea sin mover el mouse


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Dessa en 18 Octubre 2012, 00:39 am
No sé si endndí bien tu pregunta, tr referías a esto ?


Código:

Option Explicit

Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


Private Sub Form_Load()
Caption = 0
Timer1.Interval = 15
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbLeftButton Then Caption = Caption + 1
End Sub

Private Sub Timer1_Timer()
  Call SendMessage(Picture1.hwnd, WM_LBUTTONDOWN, 0, 0&)
  Call SendMessage(Picture1.hwnd, WM_LBUTTONUP, 0, 0&)
End Sub





Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 18 Octubre 2012, 01:50 am
Ahora entendi, pero si yo no tengo Picture1_MouseUp en el proyecto, no hay forma de hacer un evento click con sendmessage y que entre como si lo apretara manualmente? osea en Picture1_click


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Dessa en 18 Octubre 2012, 03:25 am
Si desde tu aplicacion tenes que mandar un click a un picture de una aplicacion externa (supongo que es por eso que decis que no tenes el evento Picture1_MouseUp) simplemente capturas el Hwnd del picture externo y le mandas los mensajes

Call SendMessage(hwnd_del_picture_externo, WM_LBUTTONDOWN, 0, 0&)
Call SendMessage(hwnd_del_picture_externo, WM_LBUTTONUP, 0, 0&)

los mensajes llegarán a la coordenada 1,1 (x-y) del control

si queres mandar el click a una coordenada espesífica tenes que usar Make_lParam

http://foro.elhacker.net/programacion_visual_basic/clickear_sin_mover_mouse-t334718.0.html;msg1652116#msg1652116 (http://foro.elhacker.net/programacion_visual_basic/clickear_sin_mover_mouse-t334718.0.html;msg1652116#msg1652116)

PD:  ByVal lParam de SendMessage as Long

 


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 18 Octubre 2012, 04:28 am
Dessa Gracias por responder, justamente eso es lo que indique a principio del post, y si lo hago en un textbox, me clickea, pero en un picturebox, o en un formulario, no manda el click, podes probarlo exactamente asi como me dijiste vos, y si lo mandas al hwnd de un textbox funciona, pero al de un picture no, esa es mi duda, tendras alguna idea?


Título: Re: Clic en imagebox externo sendmessage
Publicado por: raul338 en 18 Octubre 2012, 05:07 am
Podes utilizar el Spy++ para ver que mensajes se mandan cuando haces click, de ahí, empezas a tirar esos mismos mensajes hasta que lo tengas listo!


Título: Re: Clic en imagebox externo sendmessage
Publicado por: MCKSys Argentina en 18 Octubre 2012, 06:21 am
También podés probar con SendInput: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx)

Para no tener que pasar por todo el tema de los mensajes...


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 18 Octubre 2012, 15:09 pm
MCKSys Argentina: Si con sendinput manda el click, pero implica que se mueva el mouse por lo que estuve probando... Sin mover el mouse creo que no hay forma o si?

raul338: Ahora veo si puedo usar el spy++, la verdad nunca lo use, gracias!


EDIT: Acabo de probar el spy++, bastante facil de usar parece, filtre donde dice MOUSE, me pare sobre el picture, clicke sin mover el mouse y aparecieron dos eventos:
http://s7.postimage.org/hfnf3vfop/Dibujo.png
(http://s7.postimage.org/hfnf3vfop/Dibujo.png)

Asi tuve que declarar para tener los datos exactamente iguales: (Use postmessage esta ves)

Código:
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const WM_LBUTTONUP As Long = &H202
Private Const WM_LBUTTONDOWN As Long = &H201
Private Const MK_LBUTTON As Long = &H1

'PUSE LA POSICION QUE APARECIA EN EL SPY PARA CLICKEAR LAS MISMAS COORDENADAS
PostMessage HWNDx, WM_LBUTTONDOWN, MK_LBUTTON, ByVal &H540023
Pausita 200 'milisegundos
PostMessage HWNDx, WM_LBUTTONUP, 0, ByVal &H540023

DENTRO DE LOS ULTIMOS 4 EVENTOS:
Los dos primeros eventos los genere con el mouse, y los ultimos dos desde postmessage

Con el mouse envia el click y salta el msgbox, con el postmessage desde mi otro proyecto, aparece en el spy++, pero no hace ninguna accion... Cosa rara...


Título: Re: Clic en imagebox externo sendmessage
Publicado por: raul338 en 18 Octubre 2012, 16:35 pm
mmm.... fijate de mostrar todos los mensajes (excepto los de pintado, son horribles :xD y ensucian todo el log) y de ahí verás, para mi que cuando haces click con el mouse se envia otro mensaje


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 18 Octubre 2012, 17:16 pm
mmm.... fijate de mostrar todos los mensajes (excepto los de pintado, son horribles :xD y ensucian todo el log) y de ahí verás, para mi que cuando haces click con el mouse se envia otro mensaje

Posiciono el mouse sobre el picture, lo dejo fijo, apreto el mouse y suelto... Sale el mensaje y NO lo acepto aun, esto es lo que sale en el spy++:

(http://s11.postimage.org/xnprwyfyp/Dibujo.png)


Intente copiando el MOUSEACTIVATED declarandolo como dice ahi en el spy++, pero tampoco, cuando envio yo esos datos, me los envia una columna mas a la derecha (imaginen mas para la derecha en la foto que esta arriba), no se si tendra algo que ver... La verdad ya no se me ocurre que puede ser...
No entiendo por que en otro tipo de controles si funciona y en un picture no... La idea era mandar un click sin mover el mouse pero ya no se me ocurre nada...

Gracias!


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Dessa en 19 Octubre 2012, 03:09 am
Probá este codigo pasando el mouse sobre el picture externo para saber la coordena del control   (no la de pantalla ) a la que queres enviar click   y luego mandale  el click a esa coordenada con  SendMessage y Make_lParam

La aplicación externa es tuya o es "ajena" ?


FORM

Código:

Option Explicit
 
Private Sub Form_Load()
 Call SetWindowPos(Me.hwnd, &HFFFF, &H0, &H0, &H0, &H0, &H2 Or &H1) 'on top (opcional)
 Call StartHook
End Sub
Private Sub Form_Unload(Cancel As Integer)
  StopHook
End Sub




MODULO

Código:


 
Option Explicit
 

Public 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 SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

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

Private Type POINTAPI: x As Long: y As Long: End Type
 
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
 
Dim hHook As Long
 
Function Make_lParam(ByVal x As Integer, ByVal y As Integer) As Long
  Make_lParam = x Or (y * &H10000)
End Function
 
Public Sub StartHook()
     hHook = SetWindowsHookEx(&HE, AddressOf MouseProc, App.hInstance, &H0)
End Sub
 
Public Sub StopHook()
    Call UnhookWindowsHookEx(hHook)
    hHook = 0
End Sub
 
Private Function MouseProc(ByVal ncode As Long, ByVal wParam As Long, lParam As POINTAPI) As Long
 
  Dim hwndl As Long
  hwndl = WindowFromPoint(lParam.x, lParam.y)
 
  '.......................................................................
   Dim PT As POINTAPI
   Call ClientToScreen(hwndl, PT)
 
   Form1.Cls
   Form1.Print "Coordenada Screen X " & lParam.x
   Form1.Print "Coordenada Screen Y " & lParam.y
 
   Form1.Print
   Form1.Print "Coordenada Control X " & lParam.x - PT.x
   Form1.Print "Coordenada Control Y " & lParam.y - PT.y
    
   Form1.Print
   Form1.Print "hwndl del Control  " & hwndl
  '.......................................................................
  
   MouseProc = CallNextHookEx(hHook, ncode, wParam, lParam)
 
End Function







Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 19 Octubre 2012, 15:08 pm
http://foro.elhacker.net/programacion_visual_basic/clic_en_imagebox_externo_sendmessage-t373391.0.html;msg1793065#msg1793065

Dessa fijate que yo le mande tal cual las coordenadas que aparecieron en el spy++, es decir las coordenadas del control y tampoco me lo toma, en realidad lo queria hacer para otra aplicacion, pero me parecio extraño al no poder hacerlo en un picture, entonces me cree un proyecto en blanco solo con el picture, y vi que tampoco va hacia el evento Picture1_click cuando le mando sendmessage....

No importa voy a tener que usar sendinput o mouse_event, no queda otra que mover el mouse me parece, gracias de todos modos!


Título: Re: Clic en imagebox externo sendmessage
Publicado por: Cromatico en 9 Noviembre 2012, 00:03 am
Alguien se le ocurre alguna otra idea? Disculpen por el UP.