Skip to main content
 首页 » 编程设计

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

2024年02月25日31wuhuacong

我在 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或 HtmlDocument.MouseDown在已初始化上检索鼠标指针坐标的事件HtmlDocument .

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

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

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

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

HtmlDocument 在 WebBrowser.DocumentCompleted 时准备就绪。引发事件及其 ReadyState设置为 WebBrowserReadyState.Complete。

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

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

注意:
一个 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); 
}