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

vpfxa7rd  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(142)

我在PictureBox中捕获单击坐标,但我想用WebBrowser实现同样的事情。经过一些研究,我发现它是不可能订阅鼠标Click事件的WebBrowser控件。
有哪些可能的方法来捕捉点击?有没有一种元素可以让我在页面中导航,但仍然可以捕获点击?
我试图创建一个透明的面板,但透明的颜色并不意味着看到通过我看到的,当元素在后面也不捕捉点击,能够捕捉点击与面板背后的Web浏览器也将工作。
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;
    }
}
kt06eoxx

kt06eoxx1#

WebBrowser本身不提供鼠标点击坐标:你实际上并没有点击Control客户端区域,你点击的是HtmlDocument的内容。
您可以使用HtmlDocument.ClickHtmlDocument.MouseDown事件检索初始化HtmlDocument上的鼠标指针坐标。

备注

HtmlElementEventArgs对象返回鼠标的绝对坐标(整个文档区域),在e.ClientMousePosition中,以及相对于单击的HtmlElement,在e.OffsetMousePosition中。
这可能很棘手,因为当当前HtmlDocument已经创建时,您需要订阅Click事件:您不能订阅默认Document对象的事件:
即,订阅Form.Load中的事件,其中:

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

不会有任何成就永远不会引发该事件:文档是null,因此,当然,它不引用任何当前/活动的HtmlDocument。
HtmlDocumentWebBrowser.DocumentCompleted事件被引发并且其ReadyState被设置为**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);
}

相关问题