使用 Windows 窗体应用程序时如何将鼠标光标更改为自定义光标?

Posted

技术标签:

【中文标题】使用 Windows 窗体应用程序时如何将鼠标光标更改为自定义光标?【英文标题】:How to change the mouse cursor into a custom one when working with Windows Forms applications? 【发布时间】:2011-10-08 06:56:32 【问题描述】:

UserControl 中,我想将鼠标光标从箭头更改为手形图标。 我目前做的是这样的:

this.Cursor = Cursors.Hand;

这很好,它给了我一个像这样的鼠标光标:

但是我的问题来了……这显示了一只手的手指。 我需要的是一只“抓”的手,更像是这个:

我该怎么做?,如何加载图标文件 (.ico)、光标文件 (.cur) 或图像文件 (.png),并将其用作鼠标光标?

【问题讨论】:

这是一个教程:switchonthecode.com/tutorials/… 基本上它使用 PInvoke 和 Windows API 来实现你想要的。 如果提供的文件没有颜色,则接受的答案有效。如果您有颜色 - 您需要使用我在下面的回答中描述的 Windows API。 @Derek W:我没有意识到这一点。我使用的游标确实不包含颜色信息。 【参考方案1】:

如果你有游标文件:

Cursor myCursor = new Cursor("myCursor.cur");
myControl.Cursor = myCursor;

否则你必须创建一个:

更多关于custom cursors的信息

【讨论】:

完美运行!也感谢那个链接,我不知道那个网站。【参考方案2】:

在 WinForms Cursor 类中使用自定义游标的一个注意事项是,当使用流、文件名和资源构造函数重载时,提供的 .cur 文件必须是黑白颜色的。

这意味着如果.cur 文件包含除黑色和白色之外的任何颜色,这将不起作用。

Cursor myCursor = new Cursor("myCursor.cur");
myControl.Cursor = myCursor;

有一种方法可以通过使用 Windows 句柄构造函数重载来解决此限制:

使用 Windows API 创建句柄:

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr LoadCursorFromFile(string fileName);

然后将其传递给适当的Cursor 构造函数,如下所示:

IntPtr handle = LoadCursorFromFile("myCursor.cur");
Cursor myCursor = new Cursor(handle);
myControl.Cursor = myCursor;

我希望这可以防止其他人对ArgumentException 被抛出表示:Image format is not valid. The image file may be corrupted. 在使用其他Cursor 构造函数重载时使用包含颜色的.cur 文件。

【讨论】:

【参考方案3】:

你试过System.Windows.Forms.Cursor curs = new System.Windows.Forms.Cursor(file_name);吗?

【讨论】:

【参考方案4】:

我测试了这个方法。没关系。这是我的申请:

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern IntPtr LoadCursorFromFile(string fileName);
    Cursor myCursor;
    private void tsbtn_ZoomIn_Click(object sender, EventArgs e)
    
        IntPtr handle = LoadCursorFromFile("view_zoom_in.cur");
        myCursor = new Cursor(handle);
        zg1.Cursor = myCursor;
    

【讨论】:

以上是关于使用 Windows 窗体应用程序时如何将鼠标光标更改为自定义光标?的主要内容,如果未能解决你的问题,请参考以下文章

当鼠标光标位于属于面板的组合框上时如何触发面板滚动事件

有没有办法使用python将Windows鼠标光标更改为自定义光标?

将 Windows 窗体工具提示锚定到鼠标

如何将任何应用程序的选定文本放入 Windows 窗体应用程序

SetCapture ReleaseCapture

c# 动态获取当前屏幕中光标所在位置