Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WebBrowser文档中获取鼠标单击坐标_C#_Winforms_Webbrowser Control - Fatal编程技术网

C# 在WebBrowser文档中获取鼠标单击坐标

C# 在WebBrowser文档中获取鼠标单击坐标,c#,winforms,webbrowser-control,C#,Winforms,Webbrowser Control,我正在一个PictureBox中捕获点击坐标,但我想用WebBrowser实现同样的目标。经过一些研究,我发现不可能订阅WebBrowser控件的鼠标单击事件。 捕捉点击的可能方式有哪些?是否有一种元素允许我在页面中导航,但仍能捕获点击 我试图创建一个透明的面板,但透明的颜色并不意味着我看到的是透明的,当元素在后面时也不能捕捉点击,能够捕捉到在WebBrowser后面的面板的点击也会起作用 PictureBox代码: private void uploadedPNG_MouseClick(obj

我正在一个PictureBox中捕获点击坐标,但我想用WebBrowser实现同样的目标。经过一些研究,我发现不可能订阅WebBrowser控件的鼠标
单击事件。
捕捉点击的可能方式有哪些?是否有一种元素允许我在页面中导航,但仍能捕获点击

我试图创建一个透明的面板,但透明的颜色并不意味着我看到的是透明的,当元素在后面时也不能捕捉点击,能够捕捉到在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;
    }
}

WebBrowser本身不提供鼠标点击坐标:您实际上不是在点击控制客户端区域,而是在点击HtmlDocument的内容

您可以使用或事件在初始化的上检索鼠标指针坐标

注意
该对象以绝对坐标(整个文档区域)返回鼠标坐标,该坐标位于和相对于单击的
HtmlElement
,位于

这可能很棘手,因为当当前HtmlDocument已经创建时,您需要订阅
单击
事件:您无法订阅默认文档对象的事件:
i、 例如,以
形式订阅事件。加载

webBrowser1.Document.Click += (obj, evt) => { /*Do something */ };  
一事无成。事件永远不会被引发:文档是
null
,因此,当然,它不是任何当前/活动HtmlDocument的引用

当引发事件并将其设置为WebBrowserReadyState.Complete时,
HtmlDocument
准备就绪

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

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

注意
HtmlDocument
可以包含多个
帧/IFrame
,每个
帧可以有自己的
HtmlDocument
iFrame
每个都有一个。有关此问题的更多信息,请参阅本问题中的注释:

例如:

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

我不太明白这个问题,你想从winform-PictureBox控件中获取坐标吗?我可以从PictureBox或Panel中获取坐标,但我需要在WebBrowserI中获取坐标我还没有尝试过,但你可以尝试覆盖承载web浏览器的窗体的
WndProc
方法,在事件进入WebBrowser之前捕获并引发事件。您需要鼠标相对于屏幕的位置还是在控件内网页的范围内?在控件内网页的范围内谢谢,您的示例部分解决了我的问题,但我仍然不知道如何在页面导航之前获取坐标,我的应用程序的目的是生成坐标,用于自动测试,在我正在测试的web应用程序中,有多个页面,我需要记录这些坐标,我不确定在页面导航之前获取坐标是什么意思。什么的坐标?在文档加载之前,页面上没有任何内容。你能举例说明你所指的程序吗?顺便说一句,如果您指的是页面框架,那么每个框架都有自己的文档。如果需要,可以订阅每个框架文档的单击事件。如果我没有单击链接,则会记录坐标,当我单击链接到应用程序内另一个页面的按钮时,不会记录坐标。无论鼠标在何处执行单击、页面上的空白点或任何类型的链接,都会引发事件。如果你想在解决问题时得到一些帮助,你需要清楚地描述你的情况,你想要达到的目标是什么,以及什么没有达到你想要的效果。尽可能用这些细节更新你的问题,这样我可以提供一些有意义的建议。例如,这些页面上是否有多个框架?可能是IFrames?我想我现在知道原因了,我在JS中使用.off()删除了大多数情况下的事件处理程序,因为我的web应用程序也针对触摸设备,我用.off()解决了一些问题,主要是导航按钮的问题。而这正是点击事件没有被捕获的地方。