问题描述:
我的问题如图片所示
提出问题:
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)是获取整个winform应用
程序的句柄,如果设置为Intptr.Zero,将什么事件都获取不到。
有什么办法让我能够捕获到网页弹框中的事件呢?
换句话说,就是能否让我获取到整个屏幕里面的点击啊,移动啊,触摸啊这些事件,而不仅仅局限于winfrom
窗口。
期待各位的帮忙和指点,感谢!
问题描述:
我的问题如图片所示
提出问题:
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName)是获取整个winform应用
程序的句柄,如果设置为Intptr.Zero,将什么事件都获取不到。
有什么办法让我能够捕获到网页弹框中的事件呢?
换句话说,就是能否让我获取到整个屏幕里面的点击啊,移动啊,触摸啊这些事件,而不仅仅局限于winfrom
窗口。
期待各位的帮忙和指点,感谢!
引自免费微信小程序:皆我百晓生
要在WinForm应用程序中捕获嵌入的Edge WebView2控件或其他Web浏览器组件中加载网页所弹出的对话框内的用户交互事件,您需要采取不同的策略,因为这些弹框实际上是浏览器内部处理的,并不在宿主WinForm窗口的消息循环中。针对这种情况,您可以考虑以下两种方案:
方案一:使用WebView2 API
Microsoft Edge WebView2提供了多个API供宿主应用程序与内嵌网页进行交互。例如,通过JavaScript注入和互操作,您可以监听并捕获弹框元素的点击、触摸、移动等事件。
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接口与网页进行通信,以确保兼容性和稳定性。若需进一步讨论或有更具体的需求,请继续提问。