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