在C#开发中,获取系统当前鼠标图案是一个比较常见的需求,比如做桌面工具、界面状态同步时都可能用到。下面先给大家展示一张相关的示意图:

方案一:使用SystemParameters类获取默认鼠标图案
如果只需要获取系统默认的鼠标图案,不需要区分当前鼠标是普通状态、等待状态还是其他特殊状态,可以使用.NET框架自带的SystemParameters类,这个类封装了很多系统级别的参数,其中就包含鼠标相关的属性。
下面是具体的实现代码:
using System;
using System.Windows;
using System.Windows.Media.Imaging;
namespace MouseCursorDemo
{
class Program
{
static void Main(string[] args)
{
// 获取系统默认箭头鼠标图案
Cursor defaultCursor = SystemParameters.DefaultCursor;
// 如果需要转换为图片格式,可以通过Cursor的相关方法处理,这里简单输出光标信息
Console.WriteLine("默认鼠标光标类型:" + defaultCursor.ToString());
// 如果是WPF应用,也可以直接获取系统其他预设光标
// 比如等待光标
Cursor waitCursor = Cursors.Wait;
Console.WriteLine("等待状态鼠标光标:" + waitCursor.ToString());
}
}
}这种方案的优势是调用简单,不需要引入额外的系统API,适合只需要获取默认鼠标图案的场景。但缺点是无法获取当前鼠标实时切换后的图案,比如鼠标当前处于文本输入状态、拖拽状态时的对应图案。
方案二:调用Win32 API获取当前实时鼠标图案
如果需要获取当前鼠标实时的图案,就需要调用Windows的Win32 API,其中GetCursorInfo函数可以获取当前鼠标的详细信息,包括当前使用的光标句柄。
首先我们需要定义相关的结构体和函数声明:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
namespace MouseCursorDemo
{
public class Win32CursorHelper
{
// 定义光标信息结构体
[StructLayout(LayoutKind.Sequential)]
public struct CURSORINFO
{
public int cbSize; // 结构体大小
public int flags; // 光标状态标志
public IntPtr hCursor; // 光标句柄
public Point ptScreenPos; // 光标屏幕坐标
}
// 导入GetCursorInfo函数
[DllImport("user32.dll")]
public static extern bool GetCursorInfo(out CURSORINFO pci);
// 光标状态标志:光标可见
public const int CURSOR_SHOWING = 0x00000001;
// 导入GetIconInfo函数,用于获取光标图标信息
[DllImport("user32.dll")]
public static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO piconinfo);
// 定义图标信息结构体
[StructLayout(LayoutKind.Sequential)]
public struct ICONINFO
{
public bool fIcon; // 是否为图标,false表示是光标
public int xHotspot; // 光标热点X坐标
public int yHotspot; // 光标热点Y坐标
public IntPtr hbmMask; // 掩码位图句柄
public IntPtr hbmColor; // 颜色位图句柄
}
}
}接下来是获取当前鼠标图案的完整代码:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace MouseCursorDemo
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void btnGetCursor_Click(object sender, EventArgs e)
{
Win32CursorHelper.CURSORINFO cursorInfo = new Win32CursorHelper.CURSORINFO();
cursorInfo.cbSize = Marshal.SizeOf(typeof(Win32CursorHelper.CURSORINFO));
// 调用GetCursorInfo获取当前光标信息
bool success = Win32CursorHelper.GetCursorInfo(out cursorInfo);
if (success && (cursorInfo.flags & Win32CursorHelper.CURSOR_SHOWING) == Win32CursorHelper.CURSOR_SHOWING)
{
// 获取光标句柄对应的图标信息
Win32CursorHelper.ICONINFO iconInfo = new Win32CursorHelper.ICONINFO();
Win32CursorHelper.GetIconInfo(cursorInfo.hCursor, out iconInfo);
// 将光标句柄转换为Bitmap
Bitmap cursorBitmap = Bitmap.FromHicon(cursorInfo.hCursor);
// 在PictureBox中显示当前鼠标图案
pictureBox1.Image = cursorBitmap;
MessageBox.Show("成功获取当前鼠标图案,已在界面展示");
}
else
{
MessageBox.Show("获取鼠标图案失败");
}
}
}
}两种方案对比
我们可以通过下面的表格快速了解两种方案的差异:
| 方案 | 实现难度 | 适用场景 | 缺点 |
|---|---|---|---|
| SystemParameters类 | 低,无需额外API调用 | 只需要获取系统默认鼠标图案 | 无法获取当前实时切换的鼠标状态图案 |
| Win32 API调用 | 中,需要定义结构体和导入函数 | 需要获取当前鼠标实时的图案 | 需要引入系统API,代码量稍多 |
开发者可以根据自己的实际需求选择合适的方案,如果是简单的默认图案获取,优先用第一种方案,如果需要实时状态,就选择第二种方案。
C#鼠标图案SystemParametersGetCursorInfoWin32 API修改时间:2026-05-29 03:56:36