在 WebBrowser 文档中获取鼠标点击坐标

Getting mouse click coordinates in a WebBrowser Document

我在 PictureBox 中捕获点击坐标,但我想用 WebBrowser 实现同样的目的。经过一番研究,我发现无法订阅 WebBrowser 控件的鼠标 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;
    }
}

WebBrowser 本身不提供鼠标点击坐标:您实际上并没有点击 Control 客户区,您点击的是 HtmlDocument 的内容。

您可以使用 HtmlDocument.Click or HtmlDocument.MouseDown events to retrieve the Mouse pointer coordinates on an initialized HtmlDocument.

:
HtmlElementEventArgs object returns the Mouse coordinates in both absolute coordinates (the whole Document area), in e.ClientMousePosition and relative to the clicked HtmlElement, in e.OffsetMousePosition.

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

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

不会有任何成就。永远不会引发事件:文档是 null 因此,当然,它不是引用任何 current/active HtmlDocument.

WebBrowser.DocumentCompleted event is raised and its ReadyState 设置为 WebBrowserReadyState.Complete.

时,HtmlDocument 已准备就绪

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

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

:
一个HtmlDocument可能包含多个Frame/IFrame,每个Frame可能有自己的HtmlDocumentIFrames肯定各有一个。有关此问题的更多信息,请参阅此问题中的注释:

一个例子:

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);
}