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

时间:2019-01-17 08:43:18

标签: c# winforms webbrowser-control

我正在捕获PictureBox内的点击坐标,但是我想使用WebBrowser实现相同的目的。经过研究后,我发现无法预订WebBrowser控件的Mouse Click事件。
有哪些可能的方法来捕获点击?是否有某种元素可以让我浏览页面但仍然捕获点击?

我尝试创建一个透明面板,但是透明的颜色并不代表我所看到的透明,并且当元素位于背面时也无法捕获点击,因此能够在面板位于WebBrowser后面的情况下捕获点击也可以。

PictureBox代码:

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

1 个答案:

答案 0 :(得分:1)

WebBrowser本身不提供“鼠标单击”坐标:您实际上并不是在单击“控制”客户区,而是在单击“文档”的内容。

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

注意
HtmlElementEventArgs对象以e.ClientMousePosition的绝对坐标(整个文档区域)以及以e.OffsetMousePosition相对于单击的HtmlElement的形式返回鼠标坐标。

这可能很棘手,因为在创建当前HtmlDocument时需要订阅Click事件:您不能订阅默认Document对象的事件:
即通过以下方式预订Form.Load中的事件:

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

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

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

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

此外,DocumentCompleted事件可能在单个HTML页面上被引发多次,因此您需要确保您没有多次订阅同一事件:

注意
一个HtmlDocument可能包含多个 Frame/IFrame ,并且每个Frame都有自己的HtmlDocument IFrames 确保每个都有一个。有关此问题的更多信息,请参阅此问题中的注释:
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);
}