Clickeador

Iniciado por 45m0d3u5, 11 Noviembre 2008, 19:48 PM

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

45m0d3u5

Hola estimados(as):

Desde hace algun tiempo ando buscando alguna guia para realizar un programa que haga clicks de forma automatica.
La idea sería poder setear las coordenadas en las que haga los clicks y poner un timer o algo asi para definir cuando debe hacer click.
Me han dicho que en vb se puede hacer... alguien me podría dar una mano? alguna idea ...
Gracias de antemano

Dessa

#1
Hola, fijate si te puede servir este ejemplo:


Option Explicit

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 PostMessage _
        Lib "USER32" _
        Alias "PostMessageA" _
       (ByVal Hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wparam As Long, _
        ByVal lparam As Long) As Long

Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205

Private Declare Function GetWindowRect Lib "USER32" _
(ByVal Hwnd As Long, lpRect As RECT) As Long

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

Private Declare Function SetCursorPos Lib "USER32" _
(ByVal X As Long, ByVal Y As Long) As Long

Private Declare Sub mouse_event Lib "USER32" _
(ByVal dwFlags As Long, ByVal dx As Long, _
ByVal dy As Long, ByVal cButtons As Long, _
ByVal dwExtraInfo As Long)

Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_RIGHTDOWN = &H8
Private Const MOUSEEVENTF_RIGHTUP = &H10

Dim Hndl As String _


Private Sub Command1_Click()


Timer1.Enabled = False

Shell "notepad", vbNormalFocus

Clipboard.Clear
Clipboard.SetText "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Hndl = FindWindow("notepad", vbNullString)
Hndl = FindWindowEx(Hndl, 0, "edit", vbNullString)

Call PostMessage(Hndl, WM_RBUTTONDOWN, 0, 0)
Call PostMessage(Hndl, WM_RBUTTONUP, 0, 0)

Timer1.Enabled = True

End Sub

Private Sub Timer1_Timer()

Hndl = FindWindow("#32768", vbNullString)

If Hndl <> 0 Then

Dim TR As RECT
Call GetWindowRect(Hndl, TR)

Me.Cls
Me.Print TR.Right - TR.Left & "   " & TR.Bottom - TR.Top    ' tamaño de la ventana
Me.Print TR.Left & "   " & TR.Top                           ' posic x-y de la ventana


Me.Print _
TR.Left + (TR.Right - TR.Left) * 50 / 100 _
& "   " & _
TR.Top + (TR.Bottom - TR.Top) * 50 / 100


SetCursorPos TR.Left + (TR.Right - TR.Left) * 50 / 100, _
             TR.Top + (TR.Bottom - TR.Top) * 55 / 100


Dim PosX As Long: Dim PosY As Long
Call mouse_event(MOUSEEVENTF_RIGHTDOWN, PosX, PosY, 0, 0)
Call mouse_event(MOUSEEVENTF_RIGHTUP, PosX, PosY, 0, 0)

Timer1.Enabled = False

End If

End Sub




PD: Siempre que se pueda (a veces no es posible) ,es mejor llegar al evento por Handlle (como en Command1) y no por posicion (como en Timer1), saludos

EDIT: Me olvide del Load



Private Sub Form_Load()

Timer1.Enabled = False
Timer1.Interval = 100
Command1.Caption = "Click"

End Sub


Adrian Desanti

45m0d3u5

Muchas gracias ... voy a revisar  ::)

seba123neo

Hola, por ejemplo con esto haces click cada 3 segundos en la coordenada indicada...

Código (vb) [Seleccionar]
Option Explicit
Private Declare Function SetCursorPos Lib "USER32" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare Sub mouse_event Lib "USER32" _
                        (ByVal dwFlags As Long, _
                        ByVal dx As Long, _
                        ByVal dy As Long, _
                        ByVal cButtons As Long, _
                        ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4

Private Sub Timer1_Timer()
SetCursorPos 50, 800
Call MouseLeftClick(50, 800)
End Sub

Public Sub MouseLeftClick(ByVal PosX As Long, ByVal PosY As Long)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, PosX, PosY, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, PosX, PosY, 0, 0)
End Sub

Private Sub Form_Load()
Timer1.Interval = 3000
End Sub


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

45m0d3u5

muchas gracias suena bien :) voy a revisar también  :rolleyes:

WestOn

Esta bastante bien, yo tambien le voy a echar un vistazo :laugh:
En mi cabeza existe una barrera espacio-tiempo de 4cm³. ¿Alguien sabe como eliminarla?.
                                                                                                                                                                                                                            

AlbertoBSD

Estan bien los codigos, voy a tomar uno para portarlo a C.

Cual es el proposito que tienen ustedes para los click ? Publicidad $$$ ?
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

s E t H

yo le veo mas utilidad en juegos, para publicidad podes simular que visitas los links sin necesidad de hacerlo realmente y ocupar el mouse

AlbertoBSD

Cita de: s E t H en 12 Noviembre 2008, 22:42 PM
para publicidad podes simular que visitas los links sin necesidad de hacerlo realmente y ocupar el mouse

A claro el metodo lo conozco, por eso yo preguntaba que para que eran lo de los click, y ahora que lo dices, lo de los juegos no esta nada mal.

Saludos.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Dessa

Un poco mas de code GetCursorPos (para conocer la ubicacion del puntero) y SetCursorPos ( para colocar el puntero en la posición x,y)



Option Explicit

Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long

Private Declare Function SetCursorPos Lib "user32" _
(ByVal X As Long, ByVal Y As Long) As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Sub Form_Load()

Timer1.Interval = 30

Command1.Caption = "SetCursorPos"

End Sub

Private Sub Command1_Click()
     
Dim X1 As Long
Dim Y1 As Long
     
X1 = (Screen.Width / Screen.TwipsPerPixelX) / 2
Y1 = (Screen.Height / Screen.TwipsPerPixelY) / 2

SetCursorPos X1, Y1 ' Coloca el puntero en la posición x,y

End Sub

Private Sub Timer1_Timer()
   
    Dim Point As POINTAPI
   
    GetCursorPos Point ' Obtiene la posición actual del cursos en coordenandas x,y
   
    Me.Cls
    Me.Print
    Me.Print "            X: " & Point.X ' Muestra el valor actual de X en pixels
    Me.Print "            X: " & Point.X * Screen.TwipsPerPixelX ' Muestra X twips
    Me.Print
    Me.Print "            Y: " & Point.Y  ' Muestra el valor actual de Y en pixels
    Me.Print "            Y: " & Point.Y * Screen.TwipsPerPixelY ' Muestra  Y  Muestra X twips
   
    SetCursorPos Point.X, Point.Y ' Coloca el puntero en la posición x,y

End Sub




PD: si el clicck es para un ventana o un control de una aplicación externa tal vez sea mas directo llagar al Hwn. saludos

Adrian Desanti