zoukankan      html  css  js  c++  java
  • [转]C# winform与Javascript的相互调用

    <html>
    <head>
        <meta http-equiv="Content-Language" content="zh-cn">
        <script language="javascript" type="text/javascript">
    <!-- 提供给C#程序调用的方法 -->
    function messageBox(message)
    {
        alert(message);
    }
    </script>
    </head>
    <body>
        <!-- 调用C#方法 -->
        <button onclick="window.external.MyMessageBox('javascript访问C#代码')">
            javascript访问C#代码</button>
    </body>
    </html><html>
    <head>
        <meta http-equiv="Content-Language" content="zh-cn">
        <script language="javascript" type="text/javascript">
    <!-- 提供给C#程序调用的方法 -->
    function messageBox(message)
    {
        alert(message);
    }
    </script>
    </head>
    <body>
        <!-- 调用C#方法 -->
        <button onclick="window.external.MyMessageBox('javascript访问C#代码')">
            javascript访问C#代码</button>
    </body>
    </html>
    二、建立Windows应用程序
    1.创建Windows应用程序项目 
    2.在Form1窗体中添加WebBrowser控件 
    3.在Form1类的上方添加
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    这是为了将该类设置为com可访问。如果不进行该声明将会出错。
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public partial class Form1 : Form
    Url属性:WebBrowser控件显示的网页路径
    ObjectForScripting属性:该对象可由显示在WebBrowser控件中的网页所包含的脚本代码访问。
    将Url属性设置为需要进行操作的页的URL路径。
    JavaScript通过window.external调用C#公开的方法。即由ObjectForScripting属性设置的类的实例中所包含的公共方法。具体设置例子如下: 
    System.IO.FileInfo file = new System.IO.FileInfo("index.htm");
    // WebBrowser控件显示的网页路径
    webBrowser1.Url = new Uri(file.FullName);
    // 将当前类设置为可由脚本访问
    webBrowser1.ObjectForScripting = this;
    5.C#调用JavaScript方法
    通过WebBrowser类的Document属性中的InvokeScript方法调用当前网页的Javascript方法。如: 
    // 调用JavaScript的messageBox方法,并传入参数
    object[] objects = new object[1];
    objects[0] = "C#访问JavaScript脚本";
    webBrowser1.Document.InvokeScript("messageBox", objects);
    完整代码如下: 
    ==============================================================================
    JS脚本代码: 
    <script language=”javascript”>
    function jsAlert(infor)
    {
    alert(‘我要开网店、携购独立网店系统,模板最全,最专业的系统!’);
    return;
    }
    </script>
      C#代码调用如下:
      using System.Security.Permissions; 
      [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]//  注意: 类定义前需要加上下面两行,否则调用失败!
      [System.Runtime.InteropServices.ComVisibleAttribute(true)] 
      调用的函数:
      webBrowser1.Document.InvokeScript("jsAlert ", new string[] {‘ssss’}); 
      JS中调用C#函数示例:
      C#函数如下:
    public void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
    JS里的调用方法:
    <script language=”javascript”>
    function InvokeFunc()
    {
        window.external.ShowMessage(‘呵呵’);
    }
    </script>
     
      在使用C#开发winform程序过程中,我们经常会碰到嵌入了一个WebBrowser的浏览器控件。很多时候,我们需要在程序里控制网页的显示方式,或者调用网页当中的某个JS函数,反过来,也有可能网页也需要调用程序当中的函数来实现某些功能。下面我给大家讲解下如何互相进行交互。
    ===========================================================================================================
    能否定义一个c# 变量获取js里面定义的 全局变量的指向
    JScript code
    <script language="javascript"type="text/javascript">
    varg_h=55;
    functiondisplayVar(varname)
    {
    try
    {
        returneval(varname);
    }
    catch(e)
    {
        returne.description;
    }
    }
    </script>
    c#里面能否实现获取g_h变量指向的内存空间,然后修改他的值。
    我现在只能实现,显示他的值,因为eval方法返回了一个新的对象,所以改变不了原来的变量g_h
    C# code
    object[] paramArray=newobject[1];
    paramArray[0]="g_h";
    webBrowser1.Document.InvokeScript("displayVar", paramArray);
    也可以用这样来调用:
    webBrowser1.Document.InvokeScript("JS函数名", New Object() {参数})
    参数值用:多个参数用分”,“号分开 。
    例如:
    webBrowser1.Document.InvokeScript("Go", New Object() {"home","back"})
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    与脚本的互操作 
    在Case 1当中,我们已经看到,Web页面的HTML元素的事件,可以由Windows Form端来响应,可以在某种程度上看作是Web页面调用WinForm;那么反过
    来,WinForm除了可以直接访问Web页面的HTML元素之外,能否调用Web页面里的各种Script呢?
    首先是调用Web页面的脚本中已经定义好的函数。假设HTML中有如下Javascript:
    function DoAdd(a, b) {
        return a + b;
    }
    那么,我们要在WinForm调用它,只需如下代码即可:
    object oSum = webBrowser.Document.InvokeScript("DoAdd", new object[] { 1, 2 });
    int sum = Convert.ToInt32(oSum);
    其次,如果我们想执行一段Web页面中原本没有的脚本,该怎么做呢?这次.Net的类没有提供,看来还要依靠COM了。IHTMLWindow2可以将任意的字符
    串作为脚本代码来执行。
    string scriptline01 = @"function ShowPageInfo() {";
    string scriptline02 = @"      var numLinks = document.links.length; ";
    string scriptline03 = @"      var numForms = document.forms.length; ";
    string scriptline04 = @"      var numImages = document.images.length; ";
    string scriptline05 = @"      var numScripts = document.scripts.length; ";
    string scriptline06 = @"      alert('网页的统计结果:
    链接数:' + numLinks + ";
    string scriptline07 = @"         '
    表单数:' + numForms + ";
    string scriptline08 = @"         '
    图像数:' + numImages + ";
    string scriptline09 = @"         '
    脚本数:' + numScripts);}";
    string scriptline10 = @"ShowPageInfo();";
    string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 +
                        scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;
    IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
    win.execScript(strScript, "Javascript")
  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/winnxm/p/4536879.html
Copyright © 2011-2022 走看看