0

我花了很长时间在这方面工作,我几乎得到了它。然而,我正在遭受最后一个问题,它真的开始深入我的皮肤。我无法将自定义光标嵌入到我的应用程序中...

我目前正在使用以下方法将光标更改为我在解决方案资源管理器中拥有的自定义光标。它是“MyCursor.cur”,它是一个嵌入式资源,我已将“复制到输出目录”设置为“如果更新则复制”。这是我用来设置光标的代码:

public static Cursor ActuallyLoadCursor(String path)
{
    return new Cursor(LoadCursorFromFile(path));
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr LoadCursorFromFile(string fileName);

在我的表单的构造函数中:

Cursor = ActuallyLoadCursor("MyCursor.cur");

这是我加载光标并在我的应用程序中使用它的唯一方法。但是,这会将光标复制到与程序相同的文件夹中。我在网上搜索了几个小时没有运气。有没有什么方法可以做到这一点而不被复制并且没有一千行不必要的代码?

这是我尝试过的其他解决方案,但对我来说失败了:

using (MemoryStream ms = new MemoryStream(Properties.Resources.MyCursor))
{
    Cursor = new Cursor(ms);
}

Cursor = new Cursor(Assembly.GetExecutingAssembly().GetManifestResourceStream("My_Namespace.MyCursor.cur"));

这些导致:

图片格式无效。图像文件可能已损坏。参数名称:流

4

2 回答 2

0

你确定你的光标是正确的格式吗?它是一个普通的 32x32、1 位非动画光标(例如,使用 Visual Studio 中的光标编辑器创建)?根据文档Cursor该类仅支持最基本的光标格式——动画/彩色光标只能使用 Windows API 加载。

我之所以问,是因为我刚刚在 VS 2012 中创建了一个新的 Windows 窗体项目,添加了一个新光标,将光标添加到资源中,然后使用了以下代码:

Cursor oC;

using ( MemoryStream oMS = new MemoryStream ( Properties.Resources.Cursor1 ) )
{
    oC = new Cursor ( oMS );

    this.Cursor = oC;
}

这工作得很好 - 没有错误。(this是上面代码中的形式。)

如果您的光标是彩色的,您仍然可以将其作为资源嵌入,但您必须先将其保存到磁盘,然后才能使用LoadCursorFromFile. 不要将光标保存在您的可执行文件旁边 - 如果它不是从用户的配置文件文件夹运行,您可能没有必要的权限在该文件夹中创建新文件。在用户的临时文件夹中生成一个临时文件名(使用Path.GetTempFileName)并将光标数据保存在那里 - 加载光标后,您可以删除该文件。

于 2013-08-25T03:17:23.877 回答
0

我的解决方案没有使用任何库...

本节需要添加到课程的开头:

public static System.Windows.Forms.Cursor ActuallyLoadCursor(System.String path) {
        return new System.Windows.Forms.Cursor(LoadCursorFromFile(path));
}
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern System.IntPtr LoadCursorFromFile(string path);

在绘图部分调用它:

this.Cursor = ActuallyLoadCursor(System.AppDomain.CurrentDomain.BaseDirectory+@"..\..\Resources\cursor.cur");
于 2020-11-09T19:35:45.703 回答