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:
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:
<Flags>
Public Enum MouseEventFlags As UInteger
Absolute = &H8000UI
LeftDown = &H2UI
LeftUp = &H4UI
MiddleDown = &H20UI
MiddleUp = &H40UI
Move = &H1UI
RightDown = &H8UI
RightUp = &H10UI
XDown = &H80UI
XUp = &H100UI
Wheel = &H800UI
HWheel = &H1000UI
End Enum
Friend NotInheritable Class NativeMethods
<Obsolete>
<SuppressUnmanagedCodeSecurity>
<DllImport("User32.dll", EntryPoint:="mouse_event")>
Friend Shared Sub MouseEvent(
<MarshalAs(UnmanagedType.U4)> ByVal flags As MouseEventFlags,
ByVal x As UInteger,
ByVal y As UInteger,
ByVal data As UInteger,
ByVal extraInfo As UIntPtr)
End Sub
End Class
Dim pt As New Point(100, 100) ' Absolute position.
' Dim currentPosition As NativePoint
' NativeMethods.GetCursorPos(currentPosition)
' Dim scr As Screen = System.Windows.Forms.Screen.FromPoint(currentPosition)
Dim scr = System.Windows.Forms.Screen.PrimaryScreen
pt.X = ((pt.X * 65535) \ scr.Bounds.Width) + 1
pt.Y = ((pt.Y * 65535) \ scr.Bounds.Height) + 1
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):
Dim inputList As New List(Of Input)
Dim currentInput As New Input()
Dim pt As New Point(100, 100) ' Absolute position.
' Dim currentPosition As NativePoint
' NativeMethods.GetCursorPos(currentPosition)
' Dim scr As Screen = System.Windows.Forms.Screen.FromPoint(currentPosition)
Dim scr = System.Windows.Forms.Screen.PrimaryScreen
pt.X = ((pt.X * 65535) \ scr.Bounds.Width) + 1
pt.Y = ((pt.Y * 65535) \ scr.Bounds.Height) + 1
With currentInput
.Type = InputType.Mouse
.InputInfo.MouseInput.X = pt.X
.InputInfo.MouseInput.Y = pt.Y
.InputInfo.MouseInput.Flags = (MouseInputFlags.Absolute Or MouseInputFlags.Move)
.InputInfo.MouseInput.Time = 0
End With
inputList.Add(currentInput)
Dim count As Integer = NativeMethods.SendInput(inputList.Count, inputList.ToArray(), Marshal.SizeOf(GetType(Input)))
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...
<SuppressUnmanagedCodeSecurity>
<DllImport("User32.dll", SetLastError:=True)>
Public Shared Function SetCursorPos(ByVal x As Integer,
ByVal y As Integer
) As <MarshalAs(UnmanagedType.Bool)> Boolean
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...
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.