¿Como simular comportamiento del teclado y mouse?
Option Strict On
' Poner un DatagridView cuatro botones y dos Timer en el Form
' Agregar este código y es todo
Imports System.ComponentModel
Public Class Form1
Declare Auto Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
Declare Auto Sub mouse_event Lib "user32" (ByVal dwFlags As Int32, ByVal dx As Int32, ByVal dy As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As IntPtr)
Const MOUSEEVENTF_MOVE As Int32 = &H1 ' mouse move
Const MOUSEEVENTF_LEFTDOWN As Int32 = &H2 ' left button down
Const MOUSEEVENTF_LEFTUP As Int32 = &H4 ' left button up
Const MOUSEEVENTF_RIGHTDOWN As Int32 = &H8 ' right button down
Const MOUSEEVENTF_RIGHTUP As Int32 = &H10 ' right button up
'Const MOUSEEVENTF_MIDDLEDOWN As Int32 = &H20 ' middle button down
'Const MOUSEEVENTF_MIDDLEUP As Int32 = &H40 ' middle button up
Const MOUSEEVENTF_ABSOLUTE As Int32 = &H8000 ' absolute move
'Const MOUSEEVENTF_WHEEL As Int32 = &H800 ' wheel button rolled
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim CLM(4) As DataGridViewTextBoxColumn
CLM(0) = New DataGridViewTextBoxColumn
CLM(0).HeaderText = "X"
CLM(0).Name = "X"
CLM(0).Width = 50
CLM(0).Visible = True
DataGridView1.Columns.Add(CLM(0))
CLM(1) = New DataGridViewTextBoxColumn
CLM(1).HeaderText = "Y"
CLM(1).Name = "Y"
CLM(1).Width = 50
CLM(1).Visible = True
DataGridView1.Columns.Add(CLM(1))
CLM(2) = New DataGridViewTextBoxColumn
CLM(2).HeaderText = "Z"
CLM(2).Name = "Z"
CLM(2).Width = 50
CLM(2).Visible = True
DataGridView1.Columns.Add(CLM(2))
CLM(3) = New DataGridViewTextBoxColumn
CLM(3).HeaderText = "T"
CLM(3).Name = "T"
CLM(3).Width = 50
CLM(3).Visible = True
DataGridView1.Columns.Add(CLM(3))
DataGridView1.ReadOnly = True
'DataGridView1.Visible = False ' Si todo funciona bien
Timer1.Interval = 10 : Timer2.Interval = 1000
Button1.Text = "REC" : Button2.Text = "STP" : Button3.Text = "PLY" : Button4.Text = "CLR"
Button1.Enabled = True : Button2.Enabled = False : Button3.Enabled = False : Button4.Enabled = False
End Sub
Dim SLR As Boolean = False
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Button1.Enabled = False : Button2.Enabled = True : Button2.Focus()
Timer2.Start()
Timer1.Start()
End Sub
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
If X_ACT = X_ANT And Y_ACT = Y_ANT Then
ROWS = DataGridView1.RowCount - 1
NN = NN + 1
If NN > 1 Then
If DataGridView1.AllowUserToAddRows = True Then
DataGridView1.Rows(ROWS - 1).Cells(3).Value = (NN - 1).ToString
Else
DataGridView1.Rows(ROWS).Cells(3).Value = (NN - 1).ToString
End If
End If
End If
End Sub
Dim MT As Integer = 0, MT_ANT As Integer = 0, GA As Integer = 0
Dim X_ACT As String, Y_ACT As String, X_ANT As String, Y_ANT As String, ROWS As Integer = 0
Dim NN As Integer = 0
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
X_ACT = CStr(Cursor.Position.X)
Y_ACT = CStr(Cursor.Position.Y)
For MT = 250 To 1 Step -1
GA = GetAsyncKeyState(MT)
If GA <> 0 Then
Exit For
End If
Next
If MT < 0 Then ' Hay combinaciones raras que lanzan a MT = -1
MT = 0
End If
If MT = MT_ANT Then ' Aquí entra lo igual a lo anterior evitando repeticiones
' Pero si son ceros o unos
If MT = 0 Then
If X_ACT = X_ANT And Y_ACT = Y_ANT Then
Else ' Solo si la posición del cursor se mueve
DataGridView1.Rows.Add(X_ACT, Y_ACT, MT.ToString, "")
X_ANT = X_ACT : Y_ANT = Y_ACT
NN = 0
End If
ElseIf MT = 1 Then ' Según convenga al programa, graba continuamente la presion del mouse
DataGridView1.Rows.Add(X_ACT, Y_ACT, MT.ToString, "") ' Al seleccionar o arrastrar por ejemplo
NN = 0
End If
Else
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" & Chr(32), (Chr(MT_ANT))) <> 0 Then
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" & Chr(32), (Chr(MT))) <> 0 Then
DataGridView1.Rows.Add(X_ACT, Y_ACT, "0", "") ' Le da un cero de separacion
MT_ANT = MT
End If
End If
NN = 0
DataGridView1.Rows.Add(X_ACT, Y_ACT, MT.ToString, "")
MT_ANT = MT
End If
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Timer1.Stop() : Timer2.Stop() : Button2.Enabled = False : Button3.Enabled = True : Button4.Enabled = True
Button3.Focus()
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Button3.Enabled = False : Button4.Enabled = False
ROW = 0
ROWS = DataGridView1.RowCount - 1
PLY()
End Sub
Dim ROW As Integer = 1, Z_ACT As String = "", Z_ANT As String, T_ACT As String = "", PX As String, PY As String, UNOS As Integer
Dim CE As String = ""
Dim L1 As String = "", L2 As String = "", L3 As String = ""
Private Sub PLY()
Do
X_ACT = DataGridView1.Rows(ROW).Cells(0).Value.ToString
Y_ACT = DataGridView1.Rows(ROW).Cells(1).Value.ToString
Z_ACT = DataGridView1.Rows(ROW).Cells(2).Value.ToString
T_ACT = DataGridView1.Rows(ROW).Cells(3).Value.ToString
Cursor.Position = New Point(CInt(X_ACT), CInt(Y_ACT))
PX = CStr(CInt(X_ACT) * 65535 / System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width)
PY = CStr(CInt(Y_ACT) * 65535 / System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height)
CE = ""
If T_ACT <> "" Then ' Regresa la pausa en segundos
Threading.Thread.Sleep(CInt(T_ACT) * 1000)
End If
If Z_ACT = "1" Then
UNOS = UNOS + 1
If UNOS = 1 Then ' solo entra el primer uno (LeftDown)
Threading.Thread.Sleep(300) ' para estabilizar la accion
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTDOWN, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
End If ' Esto hace posible arrastrar objetos o seleccionar texto
ElseIf Z_ANT = "1" Then ' Ya dejó de ser uno y lo suelta
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTUP, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
UNOS = 0 ' ya se produjo el leftup y se puede devolver la variable a cero
Threading.Thread.Sleep(300) ' para estabilizar la accion
End If
If Z_ACT = "2" Then
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_RIGHTDOWN, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_RIGHTUP, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
Threading.Thread.Sleep(700)
ElseIf Z_ANT = "0" And Z_ACT <> "0" Then ' TeclasDelTeclado
Z_ANT_0() : Threading.Thread.Sleep(60)
ElseIf Z_ANT = "160" Or Z_ANT = "161" Then ' Teclas Shift
Z_ANT_160_Or_Z_ANT_161()
ElseIf Z_ANT = "162" Or Z_ANT = "163" Then ' Teclas de Control
Z_ANT_162_Or_Z_ANT_163()
ElseIf Z_ANT = "164" Then ' Teclas ALT
Z_ANT_164()
Else
DblClick()
End If
If CE <> "" Then
SendKeys.SendWait(CE)
End If
ROW = ROW + 1
Z_ANT = Z_ACT
If ROW >= ROWS - 5 Then ' Para proteger que DblClick lea fuera del rango
Button3.Enabled = True : Button4.Enabled = True : Button3.Focus()
Me.Refresh() : Me.Activate() : Me.Focus()
Exit Do
End If
Threading.Thread.Sleep(20)
Application.DoEvents()
Loop
Timer2.Stop()
End Sub
Private Sub DblClick()
L1 = DataGridView1.Rows(ROW + 0).Cells(2).Value.ToString
L2 = DataGridView1.Rows(ROW + 1).Cells(2).Value.ToString
L3 = DataGridView1.Rows(ROW + 2).Cells(2).Value.ToString
If Z_ANT = "0" And L1 = "1" And L2 = "0" And L3 = "1" Then
GoTo ACT
ElseIf Z_ANT = "1" And L1 = "0" And L2 = "1" And L3 = "1" Then
GoTo ACT
End If
Exit Sub
ACT:
Threading.Thread.Sleep(10)
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTDOWN, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTUP, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
Threading.Thread.Sleep(10)
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTDOWN, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTUP, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
Threading.Thread.Sleep(10)
mouse_event(MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE + MOUSEEVENTF_LEFTUP, CInt(PX), CInt(PY), 0, CType(0, IntPtr))
End Sub
Private Sub Z_ANT_0()
If Z_ACT = "9" Then
CE = "{TAB}"
ElseIf Z_ACT = "27" Then
CE = "{ESC}"
ElseIf Z_ACT = "8" Then
CE = "{BKSP}"
ElseIf Z_ACT = "46" Then
CE = "{DEL}"
ElseIf Z_ACT = "32" Then
CE = " "
ElseIf Z_ACT = "37" Then
CE = "{LEFT}"
ElseIf Z_ACT = "39" Then
CE = "{RIGHT}"
ElseIf Z_ACT = "38" Then
CE = "{UP}"
ElseIf Z_ACT = "40" Then
CE = "{DOWN}"
ElseIf Z_ACT = "36" Then
CE = "{HOME}"
ElseIf Z_ACT = "35" Then
CE = "{END}"
ElseIf Z_ACT = "13" Then
CE = "{ENTER}"
ElseIf Z_ACT = "44" Then
' imprimir screen
ElseIf Z_ACT = "220" Then
CE = "{" & "|" & "}"
ElseIf Z_ACT = "219" Then
CE = "{" & "'" & "}"
ElseIf Z_ACT = "221" Then
CE = "{" & "¿" & "}"
ElseIf Z_ACT = "111" Then
CE = "{" & "/" & "}"
ElseIf Z_ACT = "106" Then
CE = "{" & "*" & "}"
ElseIf Z_ACT = "109" Then
CE = "{" & "-" & "}"
ElseIf Z_ACT = "107" Then
CE = "{" & "+" & "}"
ElseIf Z_ACT = "222" Then
CE = "{" & "{" & "}"
ElseIf Z_ACT = "191" Then
CE = "{" & "}" & "}"
ElseIf Z_ACT = "189" Then
CE = "{" & "-" & "}"
ElseIf Z_ACT = "190" Then
CE = "{" & "." & "}"
ElseIf Z_ACT = "188" Then
CE = "{" & "," & "}"
ElseIf Z_ACT = "226" Then
CE = "{" & "<" & "}"
ElseIf Z_ACT = "192" Then
CE = "{" & "ñ" & "}"
Else
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", UCase(Chr(CInt(Val(Z_ACT))))) <> 0 Then
If My.Computer.Keyboard.CapsLock = True Then
CE = "{" & LCase(Chr(CInt(Val(Z_ACT)))) & "}"
Else
CE = "{" & LCase(Chr(CInt(Val(Z_ACT)))) & "}"
End If
ElseIf InStr("1234567890", Chr(CInt(Val(Z_ACT)))) <> 0 Then
CE = "{" & Chr(CInt(Val(Z_ACT))) & "}"
End If
End If
End Sub
Private Sub Z_ANT_160_Or_Z_ANT_161()
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", UCase(Chr(CInt(Val(Z_ACT))))) <> 0 Then
If My.Computer.Keyboard.CapsLock = False Then
CE = "{" & UCase(Chr(CInt(Val(Z_ACT)))) & "}"
Else
CE = "{" & UCase(Chr(CInt(Val(Z_ACT)) + 32)) & "}"
End If
ElseIf Z_ACT = "49" Then
CE = "{" & "!" & "}"
ElseIf Z_ACT = "36" Then
CE = "+{HOME}"
ElseIf Z_ACT = "35" Then
CE = "+{END}"
ElseIf Z_ACT = "39" Then
CE = "+{RIGHT}"
ElseIf Z_ACT = "37" Then
CE = "+{LEFT}"
ElseIf Z_ACT = "9" Then
CE = "+{TAB}"
ElseIf Z_ACT = "50" Then
CE = "{" & Chr(34) & "}"
ElseIf Z_ACT = "51" Then
CE = "{" & "#" & "}"
ElseIf Z_ACT = "52" Then
CE = "{" & "$" & "}"
ElseIf Z_ACT = "53" Then
CE = "{" & "%" & "}"
ElseIf Z_ACT = "54" Then
CE = "{" & "&" & "}"
ElseIf Z_ACT = "55" Then
CE = "{" & "/" & "}"
ElseIf Z_ACT = "56" Then
CE = "{" & "(" & "}"
ElseIf Z_ACT = "57" Then
CE = "{" & ")" & "}"
ElseIf Z_ACT = "48" Then
CE = "{" & "=" & "}"
ElseIf Z_ACT = "219" Then
CE = "{" & "?" & "}"
ElseIf Z_ACT = "221" Then
CE = "{" & "¡" & "}"
ElseIf Z_ACT = "222" Then
CE = "{" & "[" & "}"
ElseIf Z_ACT = "191" Then
CE = "{" & "]" & "}"
ElseIf Z_ACT = "189" Then
CE = "{" & "_" & "}"
ElseIf Z_ACT = "190" Then
CE = "{" & ":" & "}"
ElseIf Z_ACT = "188" Then
CE = "{" & ";" & "}"
ElseIf Z_ACT = "226" Then
CE = "{" & ">" & "}"
ElseIf Z_ACT = "192" Then
CE = "{" & "Ñ" & "}"
End If
End Sub
Private Sub Z_ANT_162_Or_Z_ANT_163()
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", UCase(Chr(CInt(Val(Z_ACT))))) <> 0 Then
CE = "^{" & UCase(Chr(CInt(Val(Z_ACT)))) & "}"
ElseIf Z_ACT = "36" Then
CE = "^{HOME}"
ElseIf Z_ACT = "35" Then
CE = "^{END}"
ElseIf Z_ACT = "13" Then
CE = "^{ENTER}"
End If
End Sub
Private Sub Z_ANT_164()
L1 = DataGridView1.Rows(ROW + 0).Cells(2).Value.ToString
L2 = DataGridView1.Rows(ROW + 1).Cells(2).Value.ToString
L3 = DataGridView1.Rows(ROW + 2).Cells(2).Value.ToString
If L1 = "102" And L2 = "97" And L3 = "96" Then
CE = "á"
ElseIf L1 = "99" And L2 = "97" And L3 = "96" Then
CE = "é"
ElseIf L1 = "102" And L2 = "97" And L3 = "18" Then
CE = "í"
ElseIf L1 = "102" And L2 = "98" And L3 = "97" Then
CE = "ó"
ElseIf L1 = "102" And L2 = "99" And L3 = "97" Then
CE = "ú"
ElseIf L1 = "102" And L2 = "100" And L3 = "18" Then
CE = "@"
ElseIf L1 = "102" And L2 = "100" And L3 = "97" Then
CE = "ñ"
ElseIf L1 = "102" And L2 = "101" And L3 = "97" Then
CE = "Ñ"
ElseIf L1 = "104" And L2 = "97" And L3 = "18" Then
CE = "Á" ' 181
ElseIf L1 = "100" And L2 = "97" And L3 = "18" Then
CE = "É" ' 144
ElseIf L1 = "100" And L2 = "98" And L3 = "97" Then
CE = "Í" ' 214
ElseIf L1 = "100" And L2 = "98" And L3 = "18" Then
CE = "Ó" ' 224
ElseIf L1 = "99" And L2 = "98" And L3 = "18" Then
CE = "Ú" ' 233
End If
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
DataGridView1.Rows.Clear() : Button1.Enabled = True : Button3.Enabled = False : Button4.Enabled = False : Button1.Focus()
End Sub
End Class