zoukankan      html  css  js  c++  java
  • WPF加载HTML、WPF与JavaScript交互

    目录

    一、WebBrowser加载远程网页

    二、WebBrowser加载本地网页,注:不可以加载本地样式CSS和脚本JS文件

    三、WebBrowser隐藏网页的JavaScript错误

    四、网页屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键

    五、WPF程序与网页JavaScript交互

    六、创建服务器,提供数据接口、Script、CSS文件


    一、WebBrowser加载远程网页

    wbrExam.Source = new Uri("http://cnblogs.com/sntetwt");

    二、WebBrowser加载本地网页,注:不可以加载本地样式CSS和脚本JS文件

    Uri uri = new Uri("pack://application:,,,/WPFSctipt;component/res/template.html", UriKind.Absolute);
    Stream source = Application.GetResourceStream(uri).Stream;
    wbrExam.NavigateToStream(source);

    三、WebBrowser隐藏网页的JavaScript错误

    this.wbrExam.SuppressScriptErrors(true);
    
    /// <summary>
    /// WebBrowser隐藏网页的JavaScript错误
    /// </summary>
    public static class WebBrowserExtensions
    {
        public static void SuppressScriptErrors(this WebBrowser webBrowser, bool hide)
        {
            FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
            if (fiComWebBrowser == null) return;
    
            object objComWebBrowser = fiComWebBrowser.GetValue(webBrowser);
            if (objComWebBrowser == null) return;
    
            objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide });
        }
    }

    四、网页屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键

    <script type="text/javascript">
    	//屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键     
    	document.oncontextmenu = function(){event.returnValue=false;}//屏蔽鼠标右键     
    	window.onhelp = function(){return   false}   //屏蔽F1帮助     
    	document.onkeydown = function()
    	{     
    		if   ((window.event.altKey)&&     
                    ((window.event.keyCode==37) ||       //屏蔽   Alt+   方向键   ←     
                    (window.event.keyCode == 39))) {     //屏蔽   Alt+   方向键   →     
    		    event.returnValue = false;
    		    return false;
    		}     
    		/* 注:这还不是真正地屏蔽Alt+方向键,     
                因为Alt+方向键弹出警告框时,按住Alt键不放,     
                用鼠标点掉警告框,这种屏蔽方法就失效了。*/     
    		if   ((event.keyCode==8) ||                                 //屏蔽退格删除键     
                    (event.keyCode==116) ||                             //屏蔽   F5   刷新键     
                    (event.ctrlKe && event.keyCode==82)) {              //Ctrl   +   R     
    		    event.keyCode=0;     
    		    event.returnValue=false;     
    		}     
    		if   (event.keyCode==122){event.keyCode=0;event.returnValue=false;}         //屏蔽F11     
    		if   (event.ctrlKey && event.keyCode==78) event.returnValue=false;      //屏蔽Ctrl+n     
    		if   (event.shiftKey && event.keyCode==121)event.returnValue=false;     //屏蔽shift+F10     
    		if   (window.event.srcElement.tagName == "A" && window.event.shiftKey)       
    		    window.event.returnValue = false;                                   //屏蔽shift加鼠标左键新开一网页     
    		if   ((window.event.altKey)&&(window.event.keyCode==115)){              //屏蔽Alt+F4     
    		    window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");     
    		    return   false;     
    		}     
    	}     
    </script>

    五、WPF程序与网页JavaScript交互

    public void Message(string str)
    {
        MessageBox.Show(str);
    }
    /// <summary>
    /// WebBrowser与JavaScript交互
    /// </summary>
    [System.Runtime.InteropServices.ComVisible(true)]
    public class OprateBasic
    {
        private MainWindow instance;
        public OprateBasic(MainWindow instance)
        {
            this.instance = instance;
        }
        //提供给JS调用
        public void HandleMessage(string p)
        {
            instance.Message(p);
        }
    }
    //CS调用JS
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.wbrExam.InvokeScript("invokeScript", new object[] { "CS调用JS" });
    }
    

      

    JS调用CS
    window.external.HandleMessage("JS调用CS");
    

      

    //提供给CS调用
    function invokeScript(args) {
                alert(args);
    }

    六、创建服务器,提供数据接口、Script、CSS文件

    总结:因为加载HTML文件的时候,HTML没有路径,所以加载不了JS和CSS等外部文件

    创建远程站点提供数据接口和外部文件

    完整的CS程序如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Reflection;
    
    namespace WPFSctipt
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
            private void Window_ContentRendered(object sender, EventArgs e)
            {
                
                //加载远程网页
                //wbrExam.Source = new Uri("http://cnblogs.com/sntetwt");
    
                Uri uri = new Uri("pack://application:,,,/WPFSctipt;component/res/template.html", UriKind.Absolute);
                Stream source = Application.GetResourceStream(uri).Stream;
                //WebBrowser隐藏网页的JavaScript错误
                this.wbrExam.SuppressScriptErrors(true);
                //WebBrowser与JavaScript交互
                this.wbrExam.ObjectForScripting = new OprateBasic(this);
                //加载本地HTML文件
                wbrExam.NavigateToStream(source);
            }
            public void Message(string str)
            {
                MessageBox.Show(str);
            }
            /// <summary>
            /// WebBrowser与JavaScript交互
            /// </summary>
            [System.Runtime.InteropServices.ComVisible(true)]
            public class OprateBasic
            {
                private MainWindow instance;
                public OprateBasic(MainWindow instance)
                {
                    this.instance = instance;
                }
                //提供给JS调用
                public void HandleMessage(string p)
                {
                    instance.Message(p);
                }
            }
            //CS调用JS
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                this.wbrExam.InvokeScript("invokeScript", new object[] { "CS调用JS" });
            }
        }
        /// <summary>
        /// WebBrowser隐藏网页的JavaScript错误
        /// </summary>
        public static class WebBrowserExtensions
        {
            public static void SuppressScriptErrors(this WebBrowser webBrowser, bool hide)
            {
                FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);
                if (fiComWebBrowser == null) return;
    
                object objComWebBrowser = fiComWebBrowser.GetValue(webBrowser);
                if (objComWebBrowser == null) return;
    
                objComWebBrowser.GetType().InvokeMember("Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { hide });
            }
        }
    }
    

      

    ASMX文件代码

    <Window x:Class="WPFSctipt.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="WPF加载HTML、WPF与JavaScript交互" Height="600" Width="800" ContentRendered="Window_ContentRendered">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="500"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <WebBrowser Grid.Row="0" Name="wbrExam" Height="500" VerticalAlignment="Top" Width="800"/>
            <Button Grid.Row="1" Content="CS调用JS" VerticalAlignment="Top" Width="200" Height="40" Margin="10" Click="Button_Click" />
        </Grid>
    </Window>
    

      

    HTML代码

    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=8" /> 
        <title></title>
        <style type="text/css">
            body{background:red;}
            .div{height:400px;}
        </style>
        <script type="text/javascript" src="http://common.cnblogs.com/script/jquery.js"></script>
    	<script type="text/javascript">
    		//屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键     
    		document.oncontextmenu = function(){event.returnValue=false;}//屏蔽鼠标右键     
    		window.onhelp = function(){return   false}   //屏蔽F1帮助     
    		document.onkeydown = function()
    		{     
    		    if   ((window.event.altKey)&&     
                        ((window.event.keyCode==37) ||       //屏蔽   Alt+   方向键   ←     
                        (window.event.keyCode == 39))) {     //屏蔽   Alt+   方向键   →     
    		        event.returnValue = false;
    		        return false;
    		    }     
    		    /* 注:这还不是真正地屏蔽Alt+方向键,     
                因为Alt+方向键弹出警告框时,按住Alt键不放,     
                用鼠标点掉警告框,这种屏蔽方法就失效了。*/     
    		    if   ((event.keyCode==8) ||                                 //屏蔽退格删除键     
                        (event.keyCode==116) ||                             //屏蔽   F5   刷新键     
                        (event.ctrlKe && event.keyCode==82)) {              //Ctrl   +   R     
    		        event.keyCode=0;     
    		        event.returnValue=false;     
    		    }     
    		    if   (event.keyCode==122){event.keyCode=0;event.returnValue=false;}         //屏蔽F11     
    		    if   (event.ctrlKey && event.keyCode==78) event.returnValue=false;      //屏蔽Ctrl+n     
    		    if   (event.shiftKey && event.keyCode==121)event.returnValue=false;     //屏蔽shift+F10     
    		    if   (window.event.srcElement.tagName == "A" && window.event.shiftKey)       
    		        window.event.returnValue = false;                                   //屏蔽shift加鼠标左键新开一网页     
    		    if   ((window.event.altKey)&&(window.event.keyCode==115)){              //屏蔽Alt+F4     
    		        window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");     
    		        return   false;     
    		    }     
    		}     
    	</script>
        <script type="text/javascript">
            $(function () {
                $("div").text("JavaScript被执行");
                window.external.HandleMessage("JS调用CS");
            })
            function invokeScript(args) {
                alert(args);
            }
        </script>
    </head>
    <body>
        <div class="div"></div>
    </body>
    </html>
    

      

  • 相关阅读:
    十五周作业
    第十四周总结
    十三周总结与感想
    排球比赛积分规则
    Centos + nginx + JBOSS AS 7 搭建Java web application
    eclipse + maven + jboss 遇到ClassNotFoundException
    “/”应用程序中的服务器错误。 纠错方法
    Sharepoint 问题集锦
    Sharepoint 问题集锦
    Sharepoint 问题集锦
  • 原文地址:https://www.cnblogs.com/sntetwt/p/6701939.html
Copyright © 2011-2022 走看看