Visual Basic.NET - ¿Como simular comportamiento del teclado y mouse?

 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 14 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

¿Como simular comportamiento del teclado y mouse?

Publicado por ASmER3 (1 intervención) el 08/08/2020 19:47:15
En java existe una clase llamada Robot la cual permite simular comportamientos del teclado y mouse, lo que quiero decir es que permite ejecutar cualquier tecla y también el click izquierdo como derecho del mouse pero, en vb.net no se si exista algo similar, estuve buscando y encontré algo de SendsKey pero no funciona con todas las teclas solo con algunas, quisiera saber si en vb.net existe algo parecido.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Roy
Val: 20
Ha disminuido su posición en 4 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

¿Como simular comportamiento del teclado y mouse?

Publicado por Roy (5 intervenciones) el 08/08/2020 20:26:17
Para simular el clic del mouse se puede crear un evento MouseEventArgs con la propiedad Button establecida en el boton que se desea presionar (si se desea clic derecho: MouseButton.Right, por ejemplo) y luego en el momento que se quiera aplicar la simulacion basta con llamar al metodo onMouseClick con ese MouseEventArgs como argumento.
Y para simular el teclado efectivamente se puede utilizar la clase SendKeys pero tomando en cuenta algunas previsiones. Primeramente, esta clase debe utilizarse con framework .NET version 3.0 o superior (las anteriores no funcionan bien) y segundo, en el app.config, agregar esta directiva para que se utilice la version correcta segun el sistema operativo instalado en el equipo anfitrion:
1
2
3
<appSettings>
 <add key="SendKeys" value="SendInput"/>
</appSettings>
Con eso implementado, solo hace falta aplicar el llamado a SendKeys en el lugar donde se quiera hacer la simulacion:
1
SendKeys.Send("{ENTER}");
En esta pagina puedes ver los valores que puedes poner en el argumento de Send (en lugar de ENTER):
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.sendkeys.send?view=netcore-3.1
Si quieres implementar la simulacion de una tecla es importante hacer notar que esta clase no es case sensitive, es decir, no distingue entre mayusculas y minusculas, si utilizar SendKeys.Send("{H}") es lo mismo que usar SendKeys.Send("{h}")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

¿Como simular comportamiento del teclado y mouse?

Publicado por Lizy (18 intervenciones) el 06/12/2021 02:16:28
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
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar