WPF加载HTMLWPF与JavaScript交互

Posted sntetwt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF加载HTMLWPF与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>

  

以上是关于WPF加载HTMLWPF与JavaScript交互的主要内容,如果未能解决你的问题,请参考以下文章

WPF与WinForm开发有什么区别?

WPFUI

转WPF中的窗口的生命周期

swift 笔记:iOS与JavaScript的交互(三):WKWebView 2.显示加载进度

swift 笔记:iOS与JavaScript的交互(一):UIWebView - 2.加载本地网页

swift 笔记:iOS与JavaScript的交互(一):UIWebView - 1.加载在线网页