You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3桌面端如何更改光标指针?指定区域光标切换方案求助

解决UWP桌面端CoreWindow.PointerCursor为null时的光标样式修改问题

针对你遇到的UWP桌面端Window.Current.CoreWindow.PointerCursor始终返回null、无法直接修改光标样式的问题,这里提供两种反射实现方案,分别对应你要的隐藏光标和进入/退出Canvas时切换十字光标的需求:

一、切换十字光标方案

通过反射获取CoreWindow的私有_pointerCursor字段,直接设置CoreCursor实例来完成光标切换:

using System.Reflection;
using Windows.UI.Core;
using Windows.UI.Xaml.Input;

private void Canvas_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    var coreWindow = Window.Current.CoreWindow;
    // 反射获取CoreWindow的私有_pointerCursor字段
    var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic);
    if (pointerCursorField != null)
    {
        // 创建十字样式光标
        var crossCursor = new CoreCursor(CoreCursorType.Cross, 0);
        pointerCursorField.SetValue(coreWindow, crossCursor);
        // 强制触发光标更新
        coreWindow.PointerCursor = crossCursor;
    }
}

private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e)
{
    var coreWindow = Window.Current.CoreWindow;
    var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic);
    if (pointerCursorField != null)
    {
        // 恢复默认箭头光标
        var arrowCursor = new CoreCursor(CoreCursorType.Arrow, 0);
        pointerCursorField.SetValue(coreWindow, arrowCursor);
        coreWindow.PointerCursor = arrowCursor;
    }
}

二、隐藏光标方案

方案1:使用系统原生隐藏光标(优先尝试)

Windows 10 1809及以上版本支持CoreCursorType.None直接隐藏光标,通过反射设置即可:

private void HideCursor()
{
    var coreWindow = Window.Current.CoreWindow;
    var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic);
    if (pointerCursorField != null)
    {
        var hiddenCursor = new CoreCursor(CoreCursorType.None, 0);
        pointerCursorField.SetValue(coreWindow, hiddenCursor);
        coreWindow.PointerCursor = hiddenCursor;
    }
}

// 恢复光标可调用上面PointerExited方法里的箭头光标恢复逻辑

方案2:自定义透明光标(兼容旧版本)

如果系统不支持原生隐藏光标,可制作1x1的透明PNG图片(命名为transparent_cursor.png),添加到项目并设置生成操作为「内容」,再通过自定义光标加载:

private void HideCursorWithCustom()
{
    var coreWindow = Window.Current.CoreWindow;
    var pointerCursorField = typeof(CoreWindow).GetField("_pointerCursor", BindingFlags.Instance | BindingFlags.NonPublic);
    if (pointerCursorField != null)
    {
        // 加载项目内的透明光标资源
        var hiddenCursor = new CoreCursor(CoreCursorType.Custom, new Uri("ms-appx:///transparent_cursor.png"));
        pointerCursorField.SetValue(coreWindow, hiddenCursor);
        coreWindow.PointerCursor = hiddenCursor;
    }
}

注意事项

  • 反射依赖UWP内部字段名_pointerCursor,目前主流桌面端版本均有效,但后续系统更新可能存在字段名变更风险。
  • 自定义光标不生效时,检查图片的生成操作是否为「内容」、资源路径是否正确。

内容的提问来源于stack exchange,提问作者JPWilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:07:39