c#鼠标绘制

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

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

第一种使用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}"; }

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

相关推荐
江沉晚呤时6 小时前
在 C# 中调用 Python 脚本:实现跨语言功能集成
python·microsoft·c#·.net·.netcore·.net core
Oberon7 小时前
Avalonia硬配.NET Framework 4.8
c#·.net·avalonia·.net framework
喵叔哟9 小时前
3. 【Blazor全栈开发实战指南】--Blazor是什么?为什么选择Blazor?
c#·.netcore
钢铁男儿12 小时前
C# 接口(接口可以继承接口)
java·算法·c#
小码编匠19 小时前
C# 的西门子数控系统 OPCUA 数据采集开发从零入门
后端·数据分析·c#
孜然卷k19 小时前
C#项目 在Vue/React前端项目中 使用使用wkeWebBrowser引用并且内部使用iframe网页外链 页面部分白屏
前端·vue.js·react.js·c#
专注VB编程开发20年20 小时前
C# VB.NET多进程-管道通信,命名管道(Named Pipes)
开发语言·c#·.net
唐青枫1 天前
C#.NET 泛型详解
c#·.net
阿蒙Amon1 天前
C#日期、时间和时区:全球化应用的时间处理艺术
java·服务器·c#
学不动CV了1 天前
深入理解C语言内存空间、函数指针(三)(重点是函数指针)
c语言·arm开发·数据库·stm32·单片机·嵌入式硬件·c#