【问题标题】:Getting mouse click coordinates in a WebBrowser Document在 WebBrowser 文档中获取鼠标点击坐标
【发布时间】:2019-01-17 08:43:17
【问题描述】:

我在 PictureBox 中捕捉点击坐标,但我想用 WebBrowser 实现同样的功能。经过一番研究,我发现无法订阅 WebBrowser 控件的 Mouse Click 事件。
捕获点击的可能方法是什么?是否有一种元素可以让我在页面中导航但仍然捕获点击?

我尝试创建一个透明面板,但透明颜色并不意味着像我看到的那样透明,并且当元素在后面时也不会捕获点击,能够通过 WebBrowser 后面的面板捕获点击也可以。

图片框代码:

private void uploadedPNG_MouseClick(object sender, MouseEventArgs e)
{
    if(uploadedPNG.Image != null && !string.IsNullOrEmpty(deviceHeight.Text) && !string.IsNullOrEmpty(deviceWidth.Text))
    {
        mouseX = e.X;
        mouseY = e.Y;
        targetHeight = Int32.Parse(deviceHeight.Text);
        targetWidth = Int32.Parse(deviceWidth.Text);
        int outPutWidth = (mouseX * targetWidth) / uploadedPNG.Width;
        int outPutHeight = (mouseY * targetHeight) / uploadedPNG.Height;
        ConsoleText.Text = "Clicked X coordinate " + outPutWidth + " Clicked Y coordinate " + outPutHeight;
    }
}

【问题讨论】:

  • 我不太明白这个问题,你想要winform-PictureBox控件的坐标吗?
  • 我可以从 PictureBox 或 Panel 中捕获坐标,但我需要在 WebBrowser 中捕获坐标
  • 我没有尝试过,但您可以尝试覆盖托管 Web 浏览器的表单的 WndProc 方法,捕获 wm_lbuttondown 并在事件进入 WebBrowser 之前引发您的事件。
  • 您需要鼠标相对于屏幕的位置还是控件内网页范围内的位置?
  • 控件内网页范围内

标签: c# .net winforms webbrowser-control


【解决方案1】:

WebBrowser 本身不提供鼠标单击坐标:您实际上不是在单击 Control 客户区域,而是在单击 HtmlDocument 的内容。

您可以使用HtmlDocument.ClickHtmlDocument.MouseDown 事件来检索已初始化 HtmlDocument 上的鼠标指针坐标。

注意
HtmlElementEventArgs 对象以绝对坐标(整个文档区域)、e.ClientMousePosition 和相对于被点击的HtmlElemente.OffsetMousePosition 的方式返回鼠标坐标。

这可能很棘手,因为您需要在当前 HtmlDocument 已创建时订阅 Click 事件:您无法订阅默认 Document 对象的事件:
即,订阅Form.Load 中的事件:

webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };  

不会完成任何事情。永远不会引发该事件:文档是 null 因此,当然,它不是任何当前/活动 HtmlDocument 的引用。

当引发WebBrowser.DocumentCompleted 事件并将其ReadyState 设置为WebBrowserReadyState.Complete 时,HtmlDocument 已准备就绪。

您可以在 Document 完全加载时订阅 Document.Click 事件,然后在 WebBrowser 导航到新页面之前删除该事件,从而创建一个新文档。

此外,DocumentCompleted 事件可能会针对单个 HTMLpage 引发多次,因此您需要确保不会多次订阅同一个事件:

注意
一个HtmlDocument 可能包含多个Frame/IFrame,每个Frame 可能有自己的HtmlDocumentIFrames 肯定各有一个。有关此问题的更多信息,请参阅此问题中的注释:
How to get an HtmlElement value inside Frames/IFrames?

一个例子:

bool WebBrowserDocumentEventSet = false;

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser wb = (sender as WebBrowser);
    if (wb.ReadyState == WebBrowserReadyState.Complete && WebBrowserDocumentEventSet == false)
    {
        WebBrowserDocumentEventSet = true;
        wb.Document.MouseDown += this.OnHtmlDocumentClick;
    }
}

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
    (sender as WebBrowser).Document.MouseDown -= this.OnHtmlDocumentClick;
    WebBrowserDocumentEventSet = false;
}

protected void OnHtmlDocumentClick(object sender, HtmlElementEventArgs e)
{
    Console.WriteLine(e.ClientMousePosition);
}

【讨论】:

  • 非常感谢,您的示例部分解决了我的问题,但我仍然不知道如何在页面导航之前获取坐标,我的应用程序的目的是生成用于自动化测试的坐标,并且在我正在测试的 Web 应用程序中有多个页面,我也需要记录这个坐标
  • 我不太清楚您的意思是在页面导航之前获取坐标。坐标是什么?在加载文档之前,页面上没有任何内容。你能提供一个你所指的程序的例子吗?顺便说一句,如果您指的是页面框架,则每个框架都有自己的文档。如果这是您想要的,您可以订阅每个框架文档的 Click 事件。 See the notes here
  • 如果我没有单击链接,则会记录坐标,当我单击链接到应用程序中另一个页面的按钮时,不会记录坐标。
  • 无论鼠标在何处执行单击、页面上的空白点或任何类型的链接,都会引发该事件。如果您需要一些帮助来解决您的问题,您需要清楚地描述您的场景、您想要实现的目标以及没有按照您的意愿工作的内容。可能用这些细节更新你的问题,所以我可以提供一些有意义的建议。例如,您在这些页面上是否有多个框架?可能是 IFrame?
  • 我想我现在知道原因了,在大多数情况下,我在 JS 中使用 .off() 来删除事件处理程序,因为我的 Web 应用程序也针对触摸设备,并且我遇到了一些我解决的问题.off(),主要是导航按钮的问题。这正是没有捕获点击事件的地方。
猜你喜欢
  • 1970-01-01
  • 2016-04-14
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多