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

如何在Windows触屏Kiosk模式的MAUI/Blazor应用中隐藏鼠标光标?

MAUI/Blazor Kiosk模式下隐藏WebView2光标解决方案

直接调用Win32的ShowCursor()无效,核心原因是WebView2作为MAUI的子控件拥有独立的HWND窗口,全局调用无法覆盖WebView2内部的光标状态重置逻辑。以下是可行的解决方法:

方法1:针对WebView2控件的窗口句柄操作

通过获取WebView2的CoreWebView2实例对应的窗口句柄,直接对其执行光标隐藏操作:

  1. 在Windows平台项目中添加Win32 API封装和辅助方法:
using System.Runtime.InteropServices;
using Microsoft.UI.Xaml.Controls;

public static class WebViewCursorHelper
{
    [DllImport("user32.dll")]
    private static extern bool ShowCursor(bool bShow);

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

    public static void HideCursor(WebView2 webView)
    {
        if (webView.CoreWebView2 != null)
        {
            // 隐藏系统光标
            ShowCursor(false);
            // 设置空光标,阻止WebView2重置光标样式
            SetCursor(IntPtr.Zero);
        }
        else
        {
            // 等待CoreWebView2初始化完成后执行
            webView.CoreWebView2InitializationCompleted += (s, e) =>
            {
                if (e.IsSuccess)
                {
                    ShowCursor(false);
                    SetCursor(IntPtr.Zero);
                }
            };
        }
    }
}
  1. 在MAUI的BlazorWebView所在页面(如MainPage.xaml.cs)中,获取平台控件实例并调用方法:
protected override void OnHandlerChanged()
{
    base.OnHandlerChanged();
#if WINDOWS
    var webViewHandler = Handler as Microsoft.Maui.Handlers.BlazorWebViewHandler;
    if (webViewHandler?.PlatformView is WebView2 webView2)
    {
        WebViewCursorHelper.HideCursor(webView2);
    }
#endif
}

方法2:全局窗口光标设置

针对MAUI应用的主窗口设置全局隐藏光标,覆盖所有子控件的光标状态:

在Windows项目的App.xaml.cs中,在窗口启动后执行光标设置:

using System.Runtime.InteropServices;
using WinRT.Interop;

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    base.OnLaunched(args);

    var mainWindow = Application.Current.Windows[0].Handler.PlatformView as Microsoft.UI.Xaml.Window;
    var hwnd = WindowNative.GetWindowHandle(mainWindow);

    // 隐藏光标并设置空光标
    ShowCursor(false);
    SetCursor(IntPtr.Zero);
}

[DllImport("user32.dll")]
private static extern bool ShowCursor(bool bShow);

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

关键注意事项

  • 必须等待WebView2的CoreWebView2初始化完成后操作,否则会因句柄无效导致失败
  • 建议在WebView2的NavigationCompleted事件中重复执行光标隐藏逻辑,防止页面加载后光标被重置
  • 应用退出时需恢复系统光标:调用ShowCursor(true)和SetCursor(LoadCursor(IntPtr.Zero, 32512))(32512为默认箭头光标ID)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:52:49