c# - Windows 窗体应用程序中的非抗锯齿手形光标

标签 c# .net winforms mouse-cursor

好的,您知道在 Windows Vista 和 Windows 7 MS 中如何更改手形光标(当您将鼠标悬停在超链接上时显示的那个),并向其添加更多细节以使其具有抗锯齿效果并且边缘美观平滑?

那么,为什么在 Windows 窗体应用程序中不是这样呢?

我厌倦了看着一个看起来像穴居人画的蹩脚手形光标。

有没有办法以编程方式告诉它显示系统中实际安装的那个?我查看了 Windows 目录中的 Cursors 文件夹,旧的手形光标甚至不存在!那么为什么 WinForms 还在使用旧的呢?我如何“升级”它?

最佳答案

是的,WinForms 控件仍然使用 Windows 98/2000 附带的老式手形光标。它缺乏 Aero 游标所具有的抗锯齿效果。这是因为 .NET Framework 包含它自己的硬编码游标,它使用该游标而不是系统默认游标。我认为这是因为 .NET 的早期版本针对的是 Windows 95 等未与此游标捆绑在一起的操作系统,但还没有进行考古学来证明这一点。

幸运的是,很容易强制它使用正确的那个。你只需要告诉操作系统你希望它使用默认的手形光标,然后无论用户在哪个版本的 Windows 上运行你的程序,它都是正确的,即使他们已经改变了默认的鼠标光标主题。

最简单的方法是继承现有控件,覆盖 WndProc function拦截WM_SETCURSOR message , 并告诉它使用系统 IDC_HAND 光标。您只需要一点 P/Invoke 魔法。

以下代码是使用 LinkLabel 控件的示例:

public class LinkLabelEx : LinkLabel
{
    private const int WM_SETCURSOR = 0x0020;
    private const int IDC_HAND = 32649;

    [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
    private static extern IntPtr LoadCursor(IntPtr hInstance, int lpCursorName);

    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    private static extern IntPtr SetCursor(IntPtr hCursor);

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_SETCURSOR)
        {
            // Set the cursor to use the system hand cursor
            SetCursor(LoadCursor(IntPtr.Zero, IDC_HAND));

            // Indicate that the message has been handled
            m.Result = IntPtr.Zero;
            return;
        }

        base.WndProc(ref m);
    }
}

关于c# - Windows 窗体应用程序中的非抗锯齿手形光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6016995/

相关文章:

c# - WinForms 上的单向绑定(bind)?

c# - 重构多个 StringBuilder.Append 语句

c# - 获得最前沿的控制

c# - 比较不同表的数据行

C# 对象数组 - 条件验证

c# - 隔离 Service Fabric ServiceContext 以进行单元测试

c# - 如何在 XAML 中绘制分割数据绑定(bind)矩形?

c# - 如何访问子例程之外的对象?

Java Webservice 和 .NET 客户端丢弃 DateTime 对象

c# - CrystalReportViewer,查看当前是否显示报表?