浅析c#中如何在form的webbrowser控件中获得鼠标坐标

下面是详细讲解“浅析C#中如何在Form的WebBrowser控件中获得鼠标坐标”的完整攻略。

什么是WebBrowser控件

WebBrowser控件是Windows Forms中的一种控件,用于在Form窗体中嵌入一个Web浏览器。WebBrowser控件是一个包装了Internet Explorer浏览器的 ActiveX 控件,支持网页浏览、脚本执行、HTML 文档编辑等功能。

如何在WebBrowser控件中获得鼠标坐标

WebBrowser控件有两种模式:文档模式和浏览器模式。在WebBrowser控件中获得鼠标坐标需要根据不同的模式进行处理。

文档模式

文档模式下,我们可以通过事件捕获鼠标移动事件,并通过JavaScript向网页发送消息来获取鼠标坐标。具体步骤如下:

  1. 在Form窗体中添加一个WebBrowser控件,并注册DocumentCompleted事件。
private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
    webBrowser1.Navigate("http://www.baidu.com");
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.MouseDown += Document_MouseDown;
}

private void Document_MouseDown(object sender, HtmlElementEventArgs e)
{
    // 获取鼠标坐标
    int x = e.MousePosition.X;
    int y = e.MousePosition.Y;
    MessageBox.Show($"鼠标坐标:{x},{y}");
}
  1. 在网页中添加一个JavaScript函数获取鼠标坐标信息,发送到C#后台。
<script type="text/javascript">
    function getMousePosition() {
        var positions = {
            x: event.clientX,
            y: event.clientY
        };
        window.external.GetMousePosition(JSON.stringify(positions));
    }
</script>
  1. 在后台代码中注册一个COM接口,并使用InvokeScript方法调用JavaScript发送鼠标坐标信息。
[ComVisible(true)]
public class ScriptManager
{
    public void GetMousePosition(string positionJson)
    {
        dynamic position = JObject.Parse(positionJson);
        int x = position.x;
        int y = position.y;
        MessageBox.Show($"鼠标坐标:{x},{y}");
    }
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var scriptManager = new ScriptManager();
    webBrowser1.ObjectForScripting = scriptManager;
    webBrowser1.Document.InvokeScript("eval", new object[] { 
        "document.addEventListener('mousemove', function (event) { getMousePosition(event); });" 
    });
}

浏览器模式

浏览器模式下,我们可以通过鼠标事件的原始参数获取鼠标坐标。具体步骤如下:

  1. 监听浏览器控件的MouseMove事件。
private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.AllowWebBrowserDrop = false;
    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
    webBrowser1.ScrollBarsEnabled = false;
    webBrowser1.Navigate("http://www.baidu.com");
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // 监听MouseMove事件
    webBrowser1.Document.MouseMove += Document_MouseMove;
}

private void Document_MouseMove(object sender, HtmlElementEventArgs e)
{
    // 获取鼠标坐标
    int x = e.MousePosition.X;
    int y = e.MousePosition.Y;
    MessageBox.Show($"鼠标坐标:{x},{y}");
}
  1. 将浏览器控件的焦点转移到HTML文档。
private void Form1_Load(object sender, EventArgs e)
{
    // 打开一个网页
    webBrowser1.AllowWebBrowserDrop = false;
    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
    webBrowser1.ScrollBarsEnabled = false;
    webBrowser1.Navigate("http://www.baidu.com");

    // 将控件的焦点移到HTML文档,以获取鼠标坐标
    webBrowser1.Document.Body.MouseDown += Document_MouseDown;
}

private void Document_MouseDown(object sender, HtmlElementEventArgs e)
{
    webBrowser1.Document.Focus();
}

示例说明

示例1:在文档模式下获取鼠标坐标

启动一个Form窗体,添加一个WebBrowser控件。在控件的DocumentCompleted事件中注册MouseDown事件,并在事件中调用JavaScript函数获取鼠标坐标,将坐标信息通过C#后台处理。

private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
    webBrowser1.Navigate("http://www.baidu.com");
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var scriptManager = new ScriptManager();
    webBrowser1.ObjectForScripting = scriptManager;
    webBrowser1.Document.InvokeScript("eval", new object[] { 
        "document.addEventListener('mousemove', function (event) { getMousePosition(event); });" 
    });
}

[ComVisible(true)]
public class ScriptManager
{
    public void GetMousePosition(string positionJson)
    {
        dynamic position = JObject.Parse(positionJson);
        int x = position.x;
        int y = position.y;
        MessageBox.Show($"鼠标坐标:{x},{y}");
    }
}

示例2:在浏览器模式下获取鼠标坐标

启动一个Form窗体,添加一个WebBrowser控件。在控件的DocumentCompleted事件中注册MouseMove事件,并在事件中获取鼠标坐标信息。

private void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.AllowWebBrowserDrop = false;
    webBrowser1.IsWebBrowserContextMenuEnabled = false;
    webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;
    webBrowser1.ScrollBarsEnabled = false;
    webBrowser1.Navigate("http://www.baidu.com");
}

private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.MouseMove += Document_MouseMove;
}

private void Document_MouseMove(object sender, HtmlElementEventArgs e)
{
    int x = e.MousePosition.X;
    int y = e.MousePosition.Y;
    MessageBox.Show($"鼠标坐标:{x},{y}");
    webBrowser1.Document.Focus();
}

总结

WebBrowser控件可以轻松嵌入一个Web浏览器到Windows Forms应用中,可以通过不同的模式获取鼠标坐标信息。在文档模式下需要使用JavaScript发送消息,而在浏览器模式下需要获取鼠标坐标事件参数。此外,在浏览器模式下需要将控件焦点移到HTML文档才能获取鼠标坐标信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析c#中如何在form的webbrowser控件中获得鼠标坐标 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++面试题之结构体内存对齐计算问题总结大全

    首先需要明确什么是内存对齐。内存对齐是指变量在内存存储时,按照系统规定的一定字节进行取整操作。目的是为了提高CPU存取数据的效率。对于结构体类型,系统会按照结构体中最大成员变量所占用的字节数来进行对齐操作,确保结构体变量存储时,每个成员变量位于结构体的正确位置,且变量之间的空间是连续的。 那么对于内存对齐计算问题,主要包括两个方面内容。一个是数据在内存中的对…

    C 2023年5月23日
    00
  • C语言实现员工工资管理系统

    C语言实现员工工资管理系统 介绍 本文将详细讲解如何用C语言实现一个员工工资管理系统。该系统将能够实现对员工信息的存储、修改、删除以及工资发放等基本功能。我们将分步骤地讲解整个系统的实现,供初学者参考。 准备工作 在开始实现之前,需要安装C语言的编译器,比如GCC。此外,需要在系统上安装适合的文本编辑器。在本文中,我们使用的是Visual Studio Co…

    C 2023年5月23日
    00
  • c/c++快乐算法第三天

    c/c++感受算法快乐(3) 开始时间2023-04-16 22:21:10 结束时间2023-04-17 00:09:34 前言:很好,这周就要结束了,大家都回学校了么,嘻嘻。回顾一下昨天的算法题,1.4抓交通肇事犯运用枚举模拟,1.5兔子产子问题运用迭代循环,1.6牛顿迭代法求方程根迭代循环,1.7最佳存款问题迭代循环。什么是迭代?对计算机特定程序中需要…

    C语言 2023年4月17日
    00
  • json 带斜杠时如何解析的实现

    在 JSON 中,斜杠 (/) 被视为特殊字符之一,用来转义其他字符,例如将双引号 (\”) 引用为字符串中的字符而不是字符串的结束标识符。JSON 规范定义,当转义序列被解码时,所有的反斜杠必须保留并被传播到最终结果中。 以下是处理 JSON 带斜杠的两条示例说明: 示例1:使用JSON.stringify()方法转换带斜杠的JSON 假设有一个 JSON…

    C 2023年5月23日
    00
  • C++实现高校教室管理系统

    C++实现高校教室管理系统 概述 本文介绍如何使用C++语言实现高校教室管理系统。本系统主要功能包括管理教室和预定教室。此外,本系统还支持多用户登录、权限管理以及数据持久化等功能。 系统需求: 管理员可以添加/删除/编辑教室信息 用户可以预定教室 支持多用户登录和权限控制 数据持久化 设计 数据结构 系统需要保存的数据主要有教室信息和用户信息。我们可以定义一…

    C 2023年5月23日
    00
  • IP地址的分类 abcde类是如何划分的

    IP地址是计算机在网络上的标识,可以用来唯一定位到某个设备。IP地址按照网络的规模和需求,被分成了不同类别,分别为A、B、C、D、E五类。其中A、B、C三类用的最为广泛。 IP地址分类 IP地址根据网络规模的不同,可分为五类,如下: A类地址:以0开头,1-126的数字段,用于大型网络; B类地址:以10开头,128-191的数字段,用于中型网络; C类地址…

    C 2023年5月23日
    00
  • C语言分支循环其嵌套语句的使用

    对于C语言程序,分支和循环结构都是非常重要的控制结构。它们可以让程序根据条件执行不同的操作,并可以利用循环结构让重复的操作更加简单和高效。 在实际编程中,分支和循环结构的嵌套使用能够更好地解决实际问题。下面我们分别讲解分支和循环在嵌套结构中的使用方法。 分支结构的嵌套使用 分支结构通常使用if / else或switch / case语句完成。分支结构的嵌套…

    C 2023年5月30日
    00
  • C语言中如何进行函数定义和调用?

    在C语言中,函数是代码的重要组成部分,有助于提高代码的复用性和可读性。函数定义通常包括函数名、参数和函数体,可以用来完成特定的任务。下面是C语言中如何进行函数定义和调用的详细攻略。 函数定义 C语言中函数定义分为两部分:函数头和函数体。函数头通常包括函数名和参数声明,参数声明可以为空。函数体是实现函数功能的代码块。 下面是一个函数定义的示例: int max…

    C 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部