elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  VB.NET mouse_event move error en destino
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: VB.NET mouse_event move error en destino  (Leído 1,093 veces)
kuhi

Desconectado Desconectado

Mensajes: 37


50 shadows of Kappa


Ver Perfil
VB.NET mouse_event move error en destino
« en: 20 Mayo 2018, 07:08 »

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!


En línea

El conocimiento no ocupa lugar, somos libres de saber cuánto queramos...
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: VB.NET mouse_event move error en destino
« Respuesta #1 en: 20 Mayo 2018, 15:29 »

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:

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.


« Última modificación: 20 Mayo 2018, 15:58 por Eleкtro » En línea


**Aincrad**


Desconectado Desconectado

Mensajes: 506



Ver Perfil
Re: VB.NET mouse_event move error en destino
« Respuesta #2 en: 21 Mayo 2018, 17:16 »

Solo es cuestión de Buscar :

Manual Como hacer para mover el mouse y hacer click en vb

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
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
<move>Como conectar la PC a la TV por el puerto del monitor???</move>
Electrónica
Rywshan 1 2,284 Último mensaje 30 Diciembre 2004, 06:47
por botboat
[move]AYUDA!!![/move]
Diseño Gráfico
Wicho 1 862 Último mensaje 28 Marzo 2005, 16:10
por _the_master_36
AT via bluetooth mouse move
Hacking Mobile
hoofmen 0 2,123 Último mensaje 29 Abril 2006, 03:24
por hoofmen
Mouse_Event código
Programación Visual Basic
edu,92 2 1,026 Último mensaje 17 Mayo 2014, 20:17
por Kyoukai
mouse_event C#
.NET (C#, VB.NET, ASP)
Jeezy 4 562 Último mensaje 5 Agosto 2018, 01:15
por Jeezy
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines