C#绘制鼠标指针的示例代码

 更新时间:2024年01月10日 09:01:43   作者:Csharp 小记  
这篇文章主要为大家详细介绍了如何利用C#实现将鼠标的指针样式给绘制成图片,显示或者保存下来,文中的示例代码讲解详细,需要的可以参考一下

前言

有用的没用的,用的上的用不上的,能写的不能写的,反正想起来就写了,比如这篇,好像一般也没什么用,emmm,或许,做录制软件的时候可以用一下。

顾名思义,本篇主要就是来实现将鼠标的指针样式给绘制成图片,显示或者保存下来。以下会通过两种方式实现,一种是C#自带的Cursor,另一种就是用Windows Api;下面分别写下两种方式的实现代码以及优势和缺陷  

开发环境:.NET Framework版本:4.8

开发工具:Visual Studio 2022

实现步骤

第一种使用C#自带的Cursor,这种方式使用起来比较简单,但是没办法正确获取到程序页面以外的指针形状

private void button1_Click(object sender, EventArgs e)
 {
     Graphics graphics = pictureBox1.CreateGraphics();
     graphics.Clear(pictureBox1.BackColor);
     int x=Cursor.Position.X;
     int y=Cursor.Position.Y;
     Cursor.Draw(graphics, new Rectangle(1,1,50,50));
     //以拉伸格式绘制
     // Cursor.DrawStretched(pictureBox1.CreateGraphics(), new Rectangle(1, 1, 50, 50));
     label1.Text = $"坐标:{x},{y}";
 }

第二种使用Windows Api,这种方式就比较全面,可以弥补上面那种方式的缺点。

/// <summary>
  /// 获取鼠标信息
  /// </summary>
  /// <param name="cInfo"></param>
  /// <returns></returns>
  [DllImport("user32.dll", EntryPoint = "GetCursorInfo")]
  private static extern bool GetCursorInfo(ref CURSORINFO cInfo);

  /// <summary>
  /// 将指定的图标从另一个模块复制到当前模块。
  /// </summary>
  /// <param name="hIcon"></param>
  /// <returns></returns>
  [DllImport("user32.dll", EntryPoint = "CopyIcon")]
  private static extern IntPtr CopyIcon(IntPtr hIcon);

  /// <summary>
  /// 获取有关指定图标或光标的信息
  /// </summary>
  /// <param name="hIcon"></param>
  /// <param name="iInfo"></param>
  /// <returns></returns>
  [DllImport("user32.dll", EntryPoint = "GetIconInfo")]
  private static extern bool GetIconInfo(IntPtr hIcon, out ICONINFO iInfo);
private (int x, int y, Bitmap bmp) CaptureCursor()
  {
      CURSORINFO cURSORINFO = new CURSORINFO();

      cURSORINFO.cbSize = Marshal.SizeOf(cURSORINFO);
      if (GetCursorInfo(ref cURSORINFO))
      {
          if (cURSORINFO.flags == 0x00000001)
          {
              IntPtr icon = CopyIcon(cURSORINFO.hCursor);

              ICONINFO iCONINFO;
              if (GetIconInfo(icon, out iCONINFO))
              {
                  int x = cURSORINFO.ptScreenPos.X - iCONINFO.xHotspot;
                  int y = cURSORINFO.ptScreenPos.Y - iCONINFO.yHotspot;
                  Bitmap bmp = Icon.FromHandle(icon).ToBitmap();
                  return (x, y, bmp);
              }
          }
      }
      return (0,0,null);
  }
private void button3_Click(object sender, EventArgs e)
  {
      var cursor = CaptureCursor();
      pictureBox1.Image = cursor.bmp;
      label1.Text = $"坐标:{cursor.x},{cursor.y}";
  }

下面看下实现效果,当鼠标在界面外时,我们主要通过Tab和Enter来触发按钮

实现效果

到此这篇关于C#绘制鼠标指针的示例代码的文章就介绍到这了,更多相关C#鼠标指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • WPF弹出右键菜单时判断鼠标是否选中该项

    WPF弹出右键菜单时判断鼠标是否选中该项

    这篇文章介绍了WPF弹出右键菜单时判断鼠标是否选中该项的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    这篇文章主要介绍了C#实现XML与实体类之间相互转换的方法,涉及C#序列化与反序列化操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#中实体类与XML相互转换方式

    C#中实体类与XML相互转换方式

    这篇文章主要介绍了C#中实体类与XML相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C# Winform实现复制文件显示进度

    C# Winform实现复制文件显示进度

    这篇文章主要介绍了C# Winform实现复制文件显示进度,用进度条来显示复制情况,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C#实现计算器精简版

    C#实现计算器精简版

    这篇文章主要为大家详细介绍了C#实现计算器精简版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 基于C#实现TCP/UDP通信及文件传输的示例

    基于C#实现TCP/UDP通信及文件传输的示例

    本文主要介绍了基于C#实现TCP/UDP通信及文件传输的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • C#创建windows系统用户的方法

    C#创建windows系统用户的方法

    这篇文章主要介绍了C#创建windows系统用户的方法,涉及C#操作用户名、密码、显示名称、描述、是否强制修改密码、密码是否过期等技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • LINQ基础之Intersect、Except和Distinct子句

    LINQ基础之Intersect、Except和Distinct子句

    这篇文章介绍了LINQ使用Intersect、Except和Distinct子句的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#使用DateTime获取日期和时间的实现

    C#使用DateTime获取日期和时间的实现

    在C#中,DateTime类是用来处理日期和时间的类,它具有许多属性和方法,用于操作和获取日期和时间的不同部分,本文就来介绍一下C#使用DateTime获取,感兴趣的可以了解一下
    2023-11-11
  • C#实现动态加载dll的方法

    C#实现动态加载dll的方法

    这篇文章主要介绍了C#实现动态加载dll的方法,涉及针对动态链接库的灵活操作技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12

最新评论