C#获取鼠标光标屏幕坐标完整示例

凌晨两点半
凌晨两点半
发布时间:2026-10-14 | 7人浏览过
原创

在C#编程中,若需实时获取鼠标在当前显示器上的绝对位置(屏幕坐标),最直接且高效的方式是通过Platform Invocation Services (P/Invoke) 调用 Windows 用户界面动态链接库(user32.dll)。该方法不依赖特定的UI框架,因此在 WinForm、WPF 甚至控制台应用中均通用。

核心实现原理

Windows 提供了一个名为 GetCursorPos 的原生 API 函数,用于检索光标的屏幕坐标。要在 C# 中使用它,我们需要执行两个关键步骤:

  1. 声明外部函数:DllImport 指向 user32.dll。
  2. 定义数据结构:匹配 Windows 结构体的 POINT 类,包含 X 和 Y 两个整型属性。

具体操作步骤

第1步:添加必要的命名空间引用

首先确保文件中引入了以下命名空间,以支持平台调用和内存布局控制:

using System;
using System.Runtime.InteropServices;

第2步:定义 POINT 结构体

由于 GetCursorPos 需要输出一个结构体对象,我们需要手动定义与 C 语言一致的布局。使用 StructLayout(LayoutKind.Sequential) 确保字段在内存中的排列顺序与 Windows API 期望的一致。

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;

    // 提供构造函数以便初始化
    public POINT(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}

第3步:声明 P/Invoke 方法

在同一个类或专门的 Utility 类中,声明导入函数。注意参数使用 out 关键字,表示该参数将接收返回值。

// 必须放在 class 内部或 static 类中
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);

第4步:调用并获取结果

在业务逻辑(如按钮点击事件、Timer定时器或鼠标移动事件中)调用上述方法即可获取当前坐标。

// 示例用法
private void GetCurrentCursorPosition()
{
    POINT pos = new POINT();
    
    // 调用 API
    if (GetCursorPos(out pos))
    {
        Console.WriteLine($"当前鼠标屏幕坐标:X={pos.X}, Y={pos.Y}");
        // 这里可以将 pos.X 和 pos.Y 赋值给 UI 控件显示
    }
    else
    {
        Console.WriteLine("无法获取光标位置");
    }
}

注意事项

  • 线程安全:GetCursorPos 是线程安全的,可以在后台线程中调用,但修改 UI 元素时需遵循 UI 线程规则(如在 WPF 中使用 Dispatcher)。
  • 多显示器支持:如果用户使用多显示器且跨越虚拟桌面,返回的坐标是相对于虚拟屏幕左上角的。X/Y 可能为负值(例如第二个显示器在主显示器左侧时)。
  • 性能影响:如果在高频循环(如每帧检测)中调用,请注意 CPU 开销。对于高性能需求场景,建议考虑使用钩子(Hook)机制替代轮询。

以上就是C#利用Win32 API获取鼠标屏幕坐标的详细内容,更多关于C#基础API调用的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表