Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: kuhi en 20 Mayo 2018, 07:08 am



Título: VB.NET mouse_event move error en destino
Publicado por: kuhi en 20 Mayo 2018, 07:08 am
Tengo el siguiente problema con mouse_event move:
El mouse se mueve a la esquina de abajo a la derecha de la pantalla en vez de a sus coordenadas correctas.

Declaraciones:
Código:
Private Declare Function apimouse_event Lib "user32.dll" Alias "mouse_event" (ByVal dwFlags As Int32, ByVal dX As Int32, ByVal dY As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As IntPtr) As Boolean

<DllImport("user32.dll")>
Private Shared Sub mouse_event(dwFlags As UInteger, dx As UInteger, dy As UInteger, dwData As UInteger, dwExtraInfo As Integer)
End Sub

Pruebas:
Código:
Private Sub Button1_Click_4(sender As Object, e As EventArgs) Handles Button1.Click
    mouse_event(MouseEventFlags.MOUSEEVENTF_MOVE, Convert.ToUInt32(txtx3.Text), Convert.ToUInt32(txtx4.Text), 0, 0)
End Sub

Private Sub savex_Click(sender As Object, e As EventArgs) Handles savex.Click
    txtx3.Text = x1.Text
    txtx4.Text = x2.Text
End Sub

Private Sub NativeMethods_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    x1.Text = MousePosition.X.ToString
    x2.Text = MousePosition.Y.ToString
End Sub

Alguna idea? Saludos y gracias!


Título: Re: VB.NET mouse_event move error en destino
Publicado por: Eleкtro en 20 Mayo 2018, 15:29 pm
Vamos por partes...

Primeramente, el flag MOUSEEVENTF_MOVE lo que hace es mover la posición del mouse relativamente desde su posición actual, dicho de otro modo, lo que estás haciendo es deslizar la posición actual mediante los offsets que le especifiques al parámetro dX y dY... por eso se te va a la esquina inferior derecha, no estás usando coordenadas absolutas.

Para realizar un movimiento absoluto debes especificar el flag MOUSEEVENTF_ABSOLUTE, pero para poder usar la función de esa manera primero debes convertir las coordenadas absolutas como indica la documentación:

  • https://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646260(v=vs.85).aspx)
Cita de: MSDN
If MOUSEEVENTF_ABSOLUTE value is specified, dx and dy contain normalized absolute coordinates between 0 and 65,535. The event procedure maps these coordinates onto the display surface. Coordinate (0,0) maps onto the upper-left corner of the display surface, (65535,65535) maps onto the lower-right corner.

Ejemplo:

Código
  1. <Flags>
  2. Public Enum MouseEventFlags As UInteger
  3.    Absolute = &H8000UI
  4.    LeftDown = &H2UI
  5.    LeftUp = &H4UI
  6.    MiddleDown = &H20UI
  7.    MiddleUp = &H40UI
  8.    Move = &H1UI
  9.    RightDown = &H8UI
  10.    RightUp = &H10UI
  11.    XDown = &H80UI
  12.    XUp = &H100UI
  13.    Wheel = &H800UI
  14.    HWheel = &H1000UI
  15. End Enum
  16.  

Código
  1. Friend NotInheritable Class NativeMethods
  2.  
  3.    <Obsolete>
  4.    <SuppressUnmanagedCodeSecurity>
  5.    <DllImport("User32.dll", EntryPoint:="mouse_event")>
  6.    Friend Shared Sub MouseEvent(
  7.   <MarshalAs(UnmanagedType.U4)> ByVal flags As MouseEventFlags,
  8.                                 ByVal x As UInteger,
  9.                                 ByVal y As UInteger,
  10.                                 ByVal data As UInteger,
  11.                                 ByVal extraInfo As UIntPtr)
  12.    End Sub
  13.  
  14. End Class

Código
  1. Dim pt As New Point(100, 100) ' Absolute position.
  2.  
  3. ' Dim currentPosition As NativePoint
  4. ' NativeMethods.GetCursorPos(currentPosition)
  5. ' Dim scr As Screen = System.Windows.Forms.Screen.FromPoint(currentPosition)
  6. Dim scr = System.Windows.Forms.Screen.PrimaryScreen
  7.  
  8. pt.X = ((pt.X * 65535) \ scr.Bounds.Width) + 1
  9. pt.Y = ((pt.Y * 65535) \ scr.Bounds.Height) + 1
  10.  
  11. NativeMethods.MouseEvent(MouseEventFlags.Absolute Or MouseEventFlags.Move, pt.X, pt.Y, 0, UIntPtr.Zero)



Segundo, la función mouse_event lleva siglos marcada como obsoleta tras la aparición de la función SendInput, que es la que deberías usar para todo lo que concierna a la simulación de eventos del teclado y el mouse...

Un ejemplo de uso de SendInput para mover el mouse de forma absoluta, ya asumiendo que tengas todas las estructuras y miembros necesarios declarados en tu código (no voy a mostrar la implementación en .NET puesto que ocupa demasiado espacio para el post):

Código
  1. Dim inputList As New List(Of Input)
  2. Dim currentInput As New Input()
  3.  
  4. Dim pt As New Point(100, 100) ' Absolute position.
  5. ' Dim currentPosition As NativePoint
  6. ' NativeMethods.GetCursorPos(currentPosition)
  7. ' Dim scr As Screen = System.Windows.Forms.Screen.FromPoint(currentPosition)
  8. Dim scr = System.Windows.Forms.Screen.PrimaryScreen
  9.  
  10. pt.X = ((pt.X * 65535) \ scr.Bounds.Width) + 1
  11. pt.Y = ((pt.Y * 65535) \ scr.Bounds.Height) + 1
  12.  
  13. With currentInput
  14.    .Type = InputType.Mouse
  15.    .InputInfo.MouseInput.X = pt.X
  16.    .InputInfo.MouseInput.Y = pt.Y
  17.    .InputInfo.MouseInput.Flags = (MouseInputFlags.Absolute Or MouseInputFlags.Move)
  18.    .InputInfo.MouseInput.Time = 0
  19. End With
  20. inputList.Add(currentInput)
  21.  
  22. Dim count As Integer = NativeMethods.SendInput(inputList.Count, inputList.ToArray(), Marshal.SizeOf(GetType(Input)))
  23.  



Tercero y último, si tu único propósito es mover el mouse a unas coordenadas relativas o absolutas entonces te estás complicando la vida excesivamente, cuando simplemente puedes usar la función nativa SetCursorPos y de este modo evitar el tener que realizar tediosas transformaciones de coordenadas...

Código
  1. <SuppressUnmanagedCodeSecurity>
  2. <DllImport("User32.dll", SetLastError:=True)>
  3. Public Shared Function SetCursorPos(ByVal x As Integer,
  4.                                    ByVal y As Integer
  5. ) As <MarshalAs(UnmanagedType.Bool)> Boolean
  6. End Function

Pero mucho mejor incluso es sin duda alguna usar diréctamente la propiedad System.Windows.Forms.Cursor.Position, y así evitar el uso de código no administrado por tu parte...
Código
  1. Cursor.Position = New Point(100, 100) ' Absolute position.

...puesto que no hay necesidad de hacer lo que estás haciendo, del modo en que lo esás intentando hacer para el fin que quieres conseguir, no en .NET. Deberías usar los miembros que el framework ya expone para manipular la posición del mouse. Para eso están ahí.

Saludos.


Título: Re: VB.NET mouse_event move error en destino
Publicado por: **Aincrad** en 21 Mayo 2018, 17:16 pm
Solo es cuestión de Buscar :

Manual Como hacer para mover el mouse y hacer click en vb (https://foro.elhacker.net/programacion_visual_basic/manual_como_hacer_para_mover_el_mouse_y_hacer_click_en_vb-t141717.0.html)

Bueno hay tienes un Buen ejemplo para mover el puntero del mause.

Bueno no es un código tan bueno como el que te dejo el compañero @Elecktro .  ;D