Esta función sirve para saber la posición actual del cursor, es una
función del API de Windows, en el caso de Visual Basic 6.0 (VB6) o anterior
es la única forma que tenemos de averiguar ese dato, pero con los lenguajes
de .NET Framework, también podemos usar el método compartido
Position de la clase Cursor que está definida en
System.Windows.Form.
La función del API utiliza un parámetro por referencia del tipo
POINT (POINT_API que lo llamo en estos
ejemplos para que no entre en conflicto con el tipo definido en
System.Drawing).
Más abajo tienes el código de ejemplo
para Visual Basic .NET, Visual C# y Visual Basic 6.0 o anterior
(VB6).
Las declaraciones en los tres lenguajes y según el API de
Windows son:
Declaración en el API de Windows:
BOOL GetCursorPos
(
LPPOINT lpPoint
);
Declaración para VB6:
Private Declare Function GetCursorPos Lib "user32.dll" ( _
ByRef lpPoint As POINT_API _
) As Long
Declaración para VB .NET:
' Hay que tener una importación a System.Runtime.InteropServices
<DllImport("user32.dll")> _
Public Function GetCursorPos(ByRef lpPoint As POINT_API) As Boolean
End Function
' Usando el formato compatible con VB6
Declare Function GetCursorPos Lib "user32.dll" ( _
ByRef lpPoint As POINT_API _
) As Boolean
Declaración para C#:
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT_API lpPoint);
Esta es una estructura (Type en VB6) para usar con la
función GetCursorPos.
Las declaraciones en los tres lenguajes y según el API de Windows son:
Declaración en el API de Windows:
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT_API, *PPOINT;
Declaración para VB6:
Private Type POINT_API
X As Long
Y As Long
End Type
Declaración para VB .NET:
Public Structure POINT_API
Public X As Integer
Public Y As Integer
End Structure
Declaración para C#:
public struct POINT_API
{
public int X;
public int Y;
}
Para crear un proyecto que use este código debes tener un formulario con tres
etiquetas en el caso de Visual Basic .NET y Visual C# o con dos etiquetas en el
caso de Visual Basic 6.0 o anterior.
En estos códigos de ejemplo se supone que la definición de la
función del API y el tipo (estructura), están definidos en un
módulo (Module) en el caso de Visual Basic .NET, en una clase
estática en el caso de Visual C#. En el código de Visual Basic
6.0 (o anterior) incluyo el código completo.
Para interceptar los eventos en Visual C# debes indicarlo
expresamente para que tanto el evento MouseMove
del formulario y de las tres etiquetas apunten al mismo método.
En Visual Basic 6.0 y Visual Basic .NET no es necesario hacer
nada especial, solo tienes que copiar el código y pegarlo en un
formulario.
Ejemplo para VB6:
'------------------------------------------------------------------------------
' GetCursorPos_VB6 (08/Jul/08)
' Ejemplo de la función del API GetCursorPos
'
' ©Guillermo 'guille' Som, 2008
'------------------------------------------------------------------------------
Option Explicit
Private Type POINT_API
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32.dll" ( _
ByRef lpPoint As POINT_API _
) As Long
Private Sub Form_MouseMove( _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Dim p As POINT_API
GetCursorPos p
Label1.Caption = _
"Posición del cursor: " & vbCrLf & _
"x= " & p.X & ", Y = " & p.Y
Label2.Caption = _
"Usando los valores de los parámetros: " & vbCrLf & _
"x= " & X & ", Y = " & Y
End Sub
Private Sub Label1_MouseMove( _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Form_MouseMove Button, Shift, X, Y
End Sub
Private Sub Label2_MouseMove( _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Form_MouseMove Button, Shift, X, Y
End Sub
Ejemplo para VB .NET:
'------------------------------------------------------------------------------
' GetCursorPos_VB (08/Jul/08)
' Ejemplo de la función del API GetCursorPos
' y el equivalente en .NET Framework: Cursor.Position
'
' ©Guillermo 'guille' Som, 2008
'------------------------------------------------------------------------------
Option Strict On
Imports System.Windows.Forms
Imports System.Runtime.InteropServices
Public Class Form1
Private Sub Form1_MouseMove(ByVal sender As Object, _
ByVal e As MouseEventArgs) _
Handles Me.MouseMove, _
Label1.MouseMove, Label2.MouseMove, _
Label3.MouseMove
Dim x As Integer = Cursor.Position.X
Dim y As Integer = Cursor.Position.Y
Label1.Text = _
"Usando Cursor.Position: " & vbCrLf & _
"x= " & x & ", Y = " & y
Dim p As POINT_API
GetCursorPos(p)
Label2.Text = _
"Usando GetCursorPos: " & vbCrLf & _
"x= " & p.X & ", Y = " & p.Y
Label3.Text = _
"Usando los valores del parámetro: " & vbCrLf & _
"x= " & e.X & ", Y = " & e.Y
End Sub
End Class
Module WinAPI
Public Structure POINT_API
Public X As Integer
Public Y As Integer
End Structure
'' Usando el formato compatible con VB6
'Declare Function GetCursorPos Lib "user32.dll" ( _
' ByRef lpPoint As POINT_API _
' ) As Boolean
' Hay que tener una importación a System.Runtime.InteropServices
<DllImport("user32.dll")> _
Public Function GetCursorPos(ByRef lpPoint As POINT_API) As Boolean
End Function
End Module
Ejemplo para C#:
//-----------------------------------------------------------------------------
// GetCursorPos_CS (08/Jul/08)
// Ejemplo de la función del API GetCursorPos
// y el equivalente en .NET Framework: Cursor.Position
//
// ©Guillermo 'guille' Som, 2008
//-----------------------------------------------------------------------------
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace GetCursorPos_CS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
int x = Cursor.Position.X;
int y = Cursor.Position.Y;
Label1.Text =
"Usando Cursor.Position: \n" +
"x= " + x + ", Y = " + y;
WinAPI.POINT_API p;
WinAPI.GetCursorPos(out p);
label2.Text =
"Usando GetCursorPos: \n" +
"x= " + p.X + ", Y = " + p.Y;
label3.Text =
"Usando los valores del parámetro: \n" +
"x= " + e.X + ", Y = " + e.Y;
}
}
static class WinAPI
{
public struct POINT_API
{
public int X;
public int Y;
}
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT_API lpPoint);
}
}