在 WebBrowser 文档中获取鼠标点击坐标
Getting mouse click coordinates in a WebBrowser Document
我在 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 or HtmlDocument.MouseDown events to retrieve the Mouse pointer coordinates on an initialized HtmlDocument.
注:
HtmlElementEventArgs object returns the Mouse coordinates in both absolute coordinates (the whole Document area), in e.ClientMousePosition and relative to the clicked HtmlElement
, in e.OffsetMousePosition.
这可能很棘手,因为当当前 HtmlDocument 已经创建时,您需要订阅 Click
事件:您不能订阅默认 Document 对象的事件:
即,订阅 Form.Load
中的事件:
webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };
不会有任何成就。永远不会引发事件:文档是 null
因此,当然,它不是引用任何 current/active HtmlDocument.
当 WebBrowser.DocumentCompleted event is raised and its ReadyState 设置为 WebBrowserReadyState.Complete
.
时,HtmlDocument
已准备就绪
您可以在文档完全加载时订阅 Document.Click
事件,然后在 WebBrowser 导航到新页面、创建新文档之前删除该事件。
此外,DocumentCompleted
事件可能会针对单个 HTML
页面引发多次,因此您需要确保不会多次订阅同一事件:
注:
一个HtmlDocument
可能包含多个Frame/IFrame
,每个Frame
可能有自己的HtmlDocument
; 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);
}
我在 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 or HtmlDocument.MouseDown events to retrieve the Mouse pointer coordinates on an initialized HtmlDocument.
注:
HtmlElementEventArgs object returns the Mouse coordinates in both absolute coordinates (the whole Document area), in e.ClientMousePosition and relative to the clicked HtmlElement
, in e.OffsetMousePosition.
这可能很棘手,因为当当前 HtmlDocument 已经创建时,您需要订阅 Click
事件:您不能订阅默认 Document 对象的事件:
即,订阅 Form.Load
中的事件:
webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };
不会有任何成就。永远不会引发事件:文档是 null
因此,当然,它不是引用任何 current/active HtmlDocument.
当 WebBrowser.DocumentCompleted event is raised and its ReadyState 设置为 WebBrowserReadyState.Complete
.
HtmlDocument
已准备就绪
您可以在文档完全加载时订阅 Document.Click
事件,然后在 WebBrowser 导航到新页面、创建新文档之前删除该事件。
此外,DocumentCompleted
事件可能会针对单个 HTML
页面引发多次,因此您需要确保不会多次订阅同一事件:
注:
一个HtmlDocument
可能包含多个Frame/IFrame
,每个Frame
可能有自己的HtmlDocument
; 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);
}