我正在开发一个 SDG(单显示组件)应用程序,为此我需要多个光标(最简单的不同颜色)用于单个窗口。我开始知道使用 C# 你可以只使用黑白光标,这并不能解决我的问题。
5 回答
Cursor 类做得很差。由于某种神秘的原因,它使用了旧的 COM 接口 (IPicture),该接口不支持彩色和动画光标。它可以用一些相当难看的肘部油脂修复:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
static class NativeMethods {
public static Cursor LoadCustomCursor(string path) {
IntPtr hCurs = LoadCursorFromFile(path);
if (hCurs == IntPtr.Zero) throw new Win32Exception();
var curs = new Cursor(hCurs);
// Note: force the cursor to own the handle so it gets released properly
var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(curs, true);
return curs;
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadCursorFromFile(string path);
}
示例用法:
this.Cursor = NativeMethods.LoadCustomCursor(@"c:\windows\cursors\aero_busy.ani");
我也尝试了一些不同的方法,它似乎适用于不同颜色的光标,但这段代码的唯一问题是鼠标光标的热点坐标不准确,即略微向右移动。但这可以通过考虑代码中的偏移来解决。
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace MID
{
public partial class CustomCursor : Form
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr LoadCursorFromFile(string filename);
public CustomCursor()
{
InitializeComponent();
Bitmap bmp = (Bitmap)Bitmap.FromFile("Path of the cursor file saved as .bmp");
bmp.MakeTransparent(Color.Black);
IntPtr ptr1 = blue.GetHicon();
Cursor cur = new Cursor(ptr1);
this.Cursor = cur;
}
}
}
这个帖子已经很老了,但它是谷歌的第一个热门话题,所以这里是 VS 2019 的答案:
someControl.Cursor = new Cursor(Properties.Resources.somePNG.GetHicon());
您应该添加具有您喜欢的任何透明度的“somePNG.png”作为项目资源。
希望它在2020年对某人有所帮助。
您可以像这样从文件动态加载游标:
var myCursor = new Cursor("myCursor.cur");
加载后,您可以像这样设置任何控件的光标:
myControl.Cursor = myCursor;
游标还接受流作为构造函数参数。这意味着您可以从嵌入在应用程序中的资源加载,而不是从文件系统加载。
Windows 不会让您拥有多个光标,但您可以在控件上绘制多个光标。您可以像这样使用游标对象的Draw
方法:
myCursor.Draw(g, new Rectangle(...));
如果您使用 TCP/IP 在客户端之间发送游标数据,那么这应该足够了。
但是,有一些应用程序支持在一台 PC 上进行多输入。(例如,Rag Doll Kung Fu)为此,您正在查看 .NET 框架不支持的内容。
您可能需要查看 PInvoking 一些 USB 调用。(我在这里没有太多经验,所以我无法详细说明。)
唯一的问题是热点将位于文件的中心。所以要么:
使文件宽两倍,高两倍,并将图标放在右下象限。
或者
使用这个复杂的代码来调整热点: Change Cursor HotSpot in WinForms / .NET