Cita de: DarK_FirefoX en 12 Junio 2016, 18:51 PM
Con respecto a tu analogía con el teclado habría que ver como funciona un controlador de teclado, no se mucho sobre controladores, y no se si de alguna forma a muy bajo nivel utilice threads (que es como se me ocurre a priori) (también voy a probar con eventos). Me explico:
Hice la prueba que dices con el teclado, presione la A (y la deje apretada, por ende en el editor de texto, se repite la AAAAAAA.....) luego, presione la S (da lo mismo con que dedo) con otro dedo, y se escribio la S (SSSSSSSSSSSSSSS.....), si ahora, en efecto se "paso" de un lugar a otro el "foco" de una tecla a otra, pero si suelto la tecla S no vuelve a pasar a la tecla A, y lo probé recursivamente con varias teclas en profundidad y sucede lo mismo.
De cualquier manera voy a hacer mis pruebas y luego te digo, si aparece alguien que sepa como hacerlo o tenga alguna idea, la espero igual que tu.
Salu2s
Si eso también lo quiero que mientras esté pulsado se mantenga la orden. Usando como ejemplo lo del teclado si mantengo pulsado A sale "AAAAAA..." y sin soltar el dedo deslizo hacia S y mantengo pulsado pone "SSSSSSSSSSSSSSS" y si suelto deja de escribir.
Pues eso pero con controles y en lugar del dedo el ratón.
Me estoy acercando...
He conseguido hacerlo pero solo funciona cuando mueves a la izquierda pero no a la derecha, usando API.
Código (vbnet) [Seleccionar]
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("user32.dll")> _
Private Shared Sub mouse_event(ByVal dwFlags As UInteger, ByVal dx As UInteger, ByVal dy As UInteger, ByVal dwData As UInteger, ByVal dwExtraInfo As Integer)
End Sub
Const MOUSEEVENTF_MOVE = &H1 ' movimiento del mouse
Const MOUSEEVENTF_LEFTDOWN = &H2 ' botón izquierdo presionado
Const MOUSEEVENTF_LEFTUP = &H4 ' botón izquierdo soltado
Const MOUSEEVENTF_RIGHTDOWN = &H8 ' botón derecho presionado
Const MOUSEEVENTF_RIGHTUP = &H10 ' botón derecho soltado
Const MOUSEEVENTF_MIDDLEDOWN = &H20 ' botón central presionado
Const MOUSEEVENTF_MIDDLEUP = &H40 ' botón central soltado
Const MOUSEEVENTF_ABSOLUTE = &H8000 ' movimiento absoluto
Dim lblkey(2) As Label
Dim Pulsado As Integer = False
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim locLBL As New Point(10, 10)
Dim inc As Integer
For I As Integer = 0 To 2
lblkey(I) = New Label
lblkey(I).Size = New Point(20, 100)
lblkey(I).BorderStyle = BorderStyle.FixedSingle
lblkey(I).Location = New Point(locLBL.X + inc, locLBL.Y)
Me.Controls.Add(lblkey(I))
inc += 19
Next
For I As Integer = 0 To 2
AddHandler lblkey(I).MouseDown, AddressOf lblkey_MouseDown
AddHandler lblkey(I).MouseUp, AddressOf lblkey_MouseUp
AddHandler lblkey(I).MouseEnter, AddressOf lblkey_MouseEnter
AddHandler lblkey(I).Click, AddressOf lblkey_MouseClick
AddHandler lblkey(I).MouseMove, AddressOf lblkey_MouseMove
Next
End Sub
Private Sub lblkey_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim Index As Integer = Array.IndexOf(lblkey, sender)
Dim punto As New Point(Me.PointToClient(Cursor.Position))
Dim X As Integer = punto.X
If X < CInt(lblkey(Index).Left) Or X > (CInt(lblkey(Index).Left) + CInt(lblkey(Index).Width)) And _
Button.MouseButtons = MouseButtons.Left And Pulsado = True Then
SueltaBoton()
ClicBoton()
End If
End Sub
Private Sub lblkey_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim Index As Integer = Array.IndexOf(lblkey, sender)
If Button.MouseButtons = MouseButtons.Left Then
lblkey(Index).BackColor = Color.Azure
End If
End Sub
Private Sub lblkey_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
End Sub
Private Sub lblkey_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
Private Sub lblkey_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim Index As Integer = Array.IndexOf(lblkey, sender)
lblkey(Index).BackColor = Color.Transparent
End Sub
Public Sub ClicBoton()
'Simula el clic del boton izquierdo del ratón
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
End Sub
Public Sub SueltaBoton()
'Simula el clic del boton izquierdo del ratón
Call mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0)
End Sub
End Class
¡¡CONSEGUIDO!!
Pulsa con el botón derecho del ratón sobre una banda y luego desliza sin soltar el botón, las bandas(que son Labels), se activarán al pasar el puntero.
Código (vbnet) [Seleccionar]
'Programmed by Lekim'
Option Strict On
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("user32.dll")> _
Private Shared Sub mouse_event(ByVal dwFlags As UInteger, _
ByVal dx As UInteger, _
ByVal dy As UInteger, _
ByVal dwData As UInteger, _
ByVal dwExtraInfo As Integer)
End Sub
Dim lblkey(5) As Label
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim locLBL As New Point(10, 10)
Dim inc As Integer
For I As Integer = 0 To 5
lblkey(I) = New Label
lblkey(I).Size = CType(New Point(20, 100), Drawing.Size)
lblkey(I).BorderStyle = BorderStyle.FixedSingle
lblkey(I).Location = New Point(locLBL.X + inc, locLBL.Y)
Me.Controls.Add(lblkey(I))
inc += 19
Next
For I As Integer = 0 To 5
AddHandler lblkey(I).MouseDown, AddressOf lblkey_MouseDown
AddHandler lblkey(I).MouseUp, AddressOf lblkey_MouseUp
AddHandler lblkey(I).MouseMove, AddressOf lblkey_MouseMove
Next
End Sub
Private Sub lblkey_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim Index As Integer = Array.IndexOf(lblkey, sender)
Dim mPoint As New Point(Me.PointToClient(Cursor.Position).X, Me.PointToClient(Cursor.Position).Y)
Dim X As Integer = mPoint.X
If X < CInt(lblkey(Index).Left) Or
X > (CInt(lblkey(Index).Left) + _
CInt(lblkey(Index).Width)) Then
EventoUp()
EventoDown()
End If
End Sub
Private Sub lblkey_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim Index As Integer = Array.IndexOf(lblkey, sender)
If Button.MouseButtons = MouseButtons.Left Then
lblkey(Index).BackColor = Color.Azure
End If
End Sub
Private Sub lblkey_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim Index As Integer = Array.IndexOf(lblkey, sender)
lblkey(Index).BackColor = Color.Transparent
End Sub
End Class
Module modEventMouse
<DllImport("user32.dll")> _
Public Sub mouse_event(ByVal dwFlags As UInteger, _
ByVal dx As UInteger, _
ByVal dy As UInteger, _
ByVal dwData As UInteger, _
ByVal dwExtraInfo As Integer)
End Sub
<Flags()> _
Public Enum MouseEventFlags As UInteger
MOUSEEVENTF_ABSOLUTE = &H8000
MOUSEEVENTF_LEFTDOWN = &H2
MOUSEEVENTF_LEFTUP = &H4
MOUSEEVENTF_MIDDLEDOWN = &H20
MOUSEEVENTF_MIDDLEUP = &H40
MOUSEEVENTF_MOVE = &H1
MOUSEEVENTF_RIGHTDOWN = &H8
MOUSEEVENTF_RIGHTUP = &H10
MOUSEEVENTF_XDOWN = &H80
MOUSEEVENTF_XUP = &H100
MOUSEEVENTF_WHEEL = &H800
MOUSEEVENTF_HWHEEL = &H1000
End Enum
''' <summary>
''' Simulate MouseDown the left mouse button
''' </summary>
''' <remarks></remarks>
Public Sub EventoDown()
Call modEventMouse.mouse_event(MouseEventFlags.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
End Sub
''' <summary>
''' Simulate MouseUp the left mouse button
''' </summary>
''' <remarks></remarks>
Public Sub EventoUp()
Call modEventMouse.mouse_event(MouseEventFlags.MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0)
End Sub
End Module
¿Realmente no hay forma de hacerlo usando puro NET?
He entrado en otro foro y no he recibido más que críticas por haber usado el API, pero ninguna solución.