el Guille, la Web del Visual Basic, C#, .NET y más...

Averiguar la posición del cursor con GetCursorPos y clases de .NET

Ejemplos para Visual Basic .NET, Visual C# y Visual Basic 6.0 (VB6)

 
Publicado el 08/Jul/2008
Actualizado el 08/Jul/2008
Autor: Guillermo 'guille' Som

Ejemplos de la función del API de Windows GetCursorPos y el equivalente en .NET Framework (Cursor.Position). El código de ejemplo tiene la declaración y la forma para usarlo para Visual Basic .NET, Visual C# y Visual Basic 6.0 (VB6).



 

GetCursorPos

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
);

 

VB6Declaración para VB6:

Private Declare Function GetCursorPos Lib "user32.dll" ( _
    ByRef lpPoint As POINT_API _
    ) As Long

 

VB.NETDeclaració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

 

C#Declaración para C#:

[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT_API lpPoint);

 


POINT / POINT_API

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;

 

VB6Declaración para VB6:

Private Type POINT_API
    X As Long
    Y As Long
End Type

 

VB.NETDeclaración para VB .NET:

Public Structure POINT_API
    Public X As Integer
    Public Y As Integer
End Structure

 

C#Declaración para C#:

public struct POINT_API
{
    public int X;
    public int Y;
}

 


Ejemplos

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);

    }
}

 



 


La fecha/hora en el servidor es: 10/11/2024 2:33:35

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024