我正在捕获PictureBox内的点击坐标,但是我想使用WebBrowser实现相同的目的。经过研究后,我发现无法预订WebBrowser控件的Mouse Click
事件。
有哪些可能的方法来捕获点击?是否有某种元素可以让我浏览页面但仍然捕获点击?
我尝试创建一个透明面板,但是透明的颜色并不代表我所看到的透明,并且当元素位于背面时也无法捕获点击,因此能够在面板位于WebBrowser后面的情况下捕获点击也可以。
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;
}
}
答案 0 :(得分:1)
WebBrowser本身不提供“鼠标单击”坐标:您实际上并不是在单击“控制”客户区,而是在单击“文档”的内容。
您可以使用HtmlDocument.Click或HtmlDocument.MouseDown事件在已初始化 HtmlDocument上检索鼠标指针坐标。
注意:
HtmlElementEventArgs对象以e.ClientMousePosition的绝对坐标(整个文档区域)以及以e.OffsetMousePosition相对于单击的HtmlElement
的形式返回鼠标坐标。
这可能很棘手,因为在创建当前HtmlDocument时需要订阅Click
事件:您不能订阅默认Document对象的事件:
即通过以下方式预订Form.Load
中的事件:
webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };
不会完成任何事情。该事件将永远不会引发:Document是null
,因此,它当然不是任何当前/活动的HtmlDocument的引用。
引发WebBrowser.DocumentCompleted事件并将其ReadyState设置为 HtmlDocument
时,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);
}