aierda 2024-03-26 17:11 采纳率: 72.1%
浏览 23
已结题

winform中捕获网页弹框中的事件

问题描述:

img

我的问题如图片所示

提出问题:
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)是获取整个winform应用
程序的句柄,如果设置为Intptr.Zero,将什么事件都获取不到。
有什么办法让我能够捕获到网页弹框中的事件呢?
换句话说,就是能否让我获取到整个屏幕里面的点击啊,移动啊,触摸啊这些事件,而不仅仅局限于winfrom
窗口。
期待各位的帮忙和指点,感谢!

  • 写回答

21条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-26 17:11
    关注

    引自免费微信小程序:皆我百晓生

    要在WinForm应用程序中捕获嵌入的Edge WebView2控件或其他Web浏览器组件中加载网页所弹出的对话框内的用户交互事件,您需要采取不同的策略,因为这些弹框实际上是浏览器内部处理的,并不在宿主WinForm窗口的消息循环中。针对这种情况,您可以考虑以下两种方案:

    方案一:使用WebView2 API

    Microsoft Edge WebView2提供了多个API供宿主应用程序与内嵌网页进行交互。例如,通过JavaScript注入和互操作,您可以监听并捕获弹框元素的点击、触摸、移动等事件。

    1. 注入JavaScript监听器: 在C#中,您可以使用WebView2的ExecuteScriptAsync方法注入JavaScript脚本,从而在网页DOM上绑定事件监听器。以下是一个简单的示例,展示如何添加一个全局的点击事件监听器:
    private async void InitializeWebView2()
    {
        // 初始化WebView2控件...
        
        // 注入JavaScript监听器
        string script = @"
            document.addEventListener('click', function(event) {
                window.chrome.webview.postMessage(JSON.stringify({eventType: 'click', target: event.target}));
            });
            // 添加其他事件监听,如touchstart, touchmove等
        ";
        await webView.CoreWebView2.ExecuteScriptAsync(script);
    }
    
    // 接收从WebView2传递过来的事件消息
    private async void WebView_CoreWebView2_ScriptToExecuteOnDocumentCreated(object sender, Microsoft.Web.WebView2.Core.ScriptToExecuteEventArgs e)
    {
        await webView.CoreWebView2.ExecuteScriptAsync(e.Script);
    }
    
    private void WebView_CoreWebView2_MessageReceived(object sender, CoreWebView2MessageReceivedEventArgs e)
    {
        string jsonMessage = e.TryGetWebMessageAsString();
        if (!string.IsNullOrEmpty(jsonMessage))
        {
            dynamic eventData = JsonConvert.DeserializeObject<dynamic>(jsonMessage);
            if (eventData.eventType == "click")
            {
                // 处理点击事件
            }
        }
    }
    

    方案二:全局鼠标键盘钩子

    虽然全局鼠标键盘钩子可以捕获屏幕上的大部分输入事件,但由于WebView2弹框实际上是独立于宿主窗口的UI组件,这种方式可能并不能有效解决您的问题。不过,如果您仍想尝试全局监听,可以按照原有的思路设置WH_MOUSE_LL和WH_KEYBOARD_LL钩子,但这可能会对系统性能造成一定影响,且不一定能捕获到WebView2内部弹框的所有事件。

    总之,对于嵌入式Web浏览器的事件捕获,推荐优先采用WebView2官方提供的API接口与网页进行通信,以确保兼容性和稳定性。若需进一步讨论或有更具体的需求,请继续提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(20条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 创建了问题 3月26日