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

PoY*_*oYo 4 .net c# webbrowser-control winforms

我在 PictureBox 中捕获点击坐标,但我想用 WebBrowser 实现同样的目标。经过一番研究,我发现无法订阅ClickWebBrowser 控件的鼠标事件。
捕获点击的可能方法有哪些?是否有一种元素可以让我浏览页面但仍然捕获点击?

我尝试创建一个透明面板,但透明颜色并不意味着我看到的透明,并且当元素在后面时也不会捕获点击,如果面板位于 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imi 5

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

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


HtmlElementEventArgs对象返回两个绝对坐标鼠标坐标(整个文档区域),在e.ClientMousePosition并且相对于点击HtmlElement,在e.OffsetMousePosition

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

webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };  
Run Code Online (Sandbox Code Playgroud)

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

一个HtmlDocument是准备当WebBrowser.DocumentCompleted引发事件和它的readyState设置为WebBrowserReadyState.Complete

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

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

注意
AHtmlDocument可能包含多个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);
}
Run Code Online (Sandbox Code Playgroud)