本项目环境:使用VS2010(C#)编写的WPF程序,通过CefSharp在程序的窗体中打开网页。需要能够实现网页后台JS代码中调用的方法,从网页接收数据,并能返回数据给网页。运行程序的电脑不允许上网,要求通过局域网内一个指定的代理服务器联网,并且只有该程序能通过代理服务器打开网页,直接用浏览器或其他应用程序仍然不允许上网(因此不能直接更改本机的LAN设置)。
首先介绍一下CefSharp,它是基于Google浏览器的一个组件,是可以用在WPF/WinForm客户端软件中的嵌入式浏览器。
如果你只需要通过客户端软件的一个窗体打开现成的网页,那么方法还是比较简单的,你可以直接参考http://www.w2bc.com/Article/54798这篇文章。
1、配置环境,加载CefSharp动态库
首先需要下载NuGet插件,它是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。使用该工具可以将CefSharp的完整程序包加载到工程中。下载地址:http://xz.cr173.com/soft2/nuget.tools.zip。
本项目是用VS2010编写的,因此运行NuGet.Tools for vs2010,安装后,在VS的“工具”菜单下会多出一项“NuGet程序包管理器”,见下图所示:
新建工程文件EmbeddedWebBrowser。点击“管理解决方案的NuGet程序包”,打开如下图所示的窗体:
在右上角联机搜索“CefSharp”,下载CefSharp.Wpf和CefSharp.Common。如果你用的不是WPF,而是WinForm,则需要下载CefSharp.WinForms和CefSharp.Common。下载的过程比较慢,网速不佳的情况下大概要一个小时左右。安装完成后,在工程文件所在目录下会多出“packages”目录。
2、MainWindow窗体:用于输入网页地址和初始化Cef
在工程文件中的MainWindow窗体中,添加一个用于输入网页地址的编辑框,和一个用于打开网页的按钮。MainWindow.xaml的代码如下所示:
<Window x:Class="EmbeddedWebBrowser.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="800" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
<Grid>
<DockPanel>
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<TextBlock Text="网页地址:" Margin="5"/>
<TextBox x:Name="txtAddress" Width="350" Margin="5"/>
<Button Content="Go" Margin="5" Click="OnGoClick" IsDefault="True"/>
</StackPanel> <Grid x:Name="MainGrid"> </Grid>
</DockPanel>
</Grid>
</Window>
该页面的后台代码MainWindow.xaml.cs如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 CefSharp; namespace EmbeddedWebBrowser
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} /// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//默认打开的页面
txtAddress.Text = "http://www.baidu.com/";
//txtAddress.Text = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName.Replace("EmbeddedWebBrowser.vshost.exe", "index.html");
//设置代理服务器
var setting = new CefSharp.CefSettings();
setting.CefCommandLineArgs.Add("--proxy-server", "http://192.168.0.105:3128");
CefSharp.Cef.Initialize(setting, true, false);
} /// <summary>
/// “Go”按钮单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnGoClick(object sender, RoutedEventArgs e)
{
//获取要打开的页面地址
string url = txtAddress.Text; if (!string.IsNullOrWhiteSpace(url))
{
//打开网页
WebPageViewer viewer = new WebPageViewer(url);
MainGrid.Children.Insert(, viewer);
}
}
}
}
这里最关键的就是:setting.CefCommandLineArgs.Add("--proxy-server", "http://192.168.0.105:3128");这是用来设置代理服务器的IP和端口的。
CefSharp.Cef.Initialize(setting, true, false); 用来初始化CEF,即嵌入式浏览器。
2016-04-18补充:CefSharp.Cef.Initialize方法在程序里只能使用一次,如果把它写在一个会多次打开的子页面,就会报错:“只能初始化一次”。因此需要将这个方法写在主程序App.cs里。并且在程序退出前使用:CefSharp.Cef.Shutdown();否则程序关闭之后,可能会由于CefSharp.Cef未关闭,而使得该程序仍然存在后台进程中(可在任务管理器中查看),影响再次打开程序使用。
3、WebPageViewer.xaml:用于打开和显示网页
创建一个用户控件WebPageViewer.xaml,用于打开和显示网页,代码如下所示:
<UserControl x:Class="EmbeddedWebBrowser.WebPageViewer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:EmbeddedWebBrowser"
xmlns:uc="clr-namespace:EmbeddedWebBrowser"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="MainGrid">
<uc:MaskLoading x:Name="maskLoading"/>
</Grid>
</UserControl>
这里的“MaskLoading ”是用来显示网页加载时的等待画面的,下面会进行介绍。
后台代码WebPageViewer.xaml.cs如下所示:
using CefSharp;
using System;
using System.Collections.Generic;
using System.Linq;
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.Net;
using CefSharp.Wpf; namespace EmbeddedWebBrowser
{
/// <summary>
/// 用于显示网页的控件
/// </summary>
public partial class WebPageViewer : UserControl, IRequestHandler
{
/// <summary>
/// 用于显示网页的自定义控件,构造函数
/// </summary>
/// <param name="url">网页地址</param>
public WebPageViewer(String url)
{
InitializeComponent(); var webView = new CefSharp.Wpf.ChromiumWebBrowser(); //注册一个JS对象
webView.RegisterJsObject("hy", new CallbackObjectForJs()); //注册网页加载事件:在*导航完成且内容加载到 WebView 控件中时发生
webView.Loaded += new RoutedEventHandler(webView_Loaded); MainGrid.Children.Insert(, webView);
webView.Address = url;
} /// <summary>
/// 网页加载完毕的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void webView_Loaded(object sender, RoutedEventArgs e)
{
maskLoading.Visibility = Visibility.Collapsed; //隐藏等待画面(正在加载...)
} public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
{
throw new NotImplementedException();
} public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
{
throw new NotImplementedException();
} public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
throw new NotImplementedException();
} public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
throw new NotImplementedException();
} public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
throw new NotImplementedException();
} public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
{
throw new NotImplementedException();
} public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
{
throw new NotImplementedException();
} public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
throw new NotImplementedException();
} public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
{
throw new NotImplementedException();
} public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
{
throw new NotImplementedException();
} public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
throw new NotImplementedException();
} public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl)
{
throw new NotImplementedException();
} public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
throw new NotImplementedException();
}
} /// <summary>
/// 网页JS中调用的方法
/// </summary>
public class CallbackObjectForJs
{
public string action(string message)
{
//MessageBox.Show("测试");
return "收到网页消息:" + message;
}
}
}
该类实现IRequestHandler接口,是为了能够和JS网页进行交互,从GetAuthCredentials到OnResourceResponse的那几个空方法都是为了实现这个接口。当然这些在打开百度时是用不到的,接下来会用一个自己编写的JS网页做讲解。
4、与JS网页之间进行交互(如果只是打开百度等现成的网页,可以忽略这一项)
先编写一个网页index.html,如下所示:
<html>
<head>
<title>Test Page</title>
</head>
<body>
<p style="color: red">Hello, World!</p>
<button onclick = helloWebkit()>test</button>
<div><p> :) </p></div>
<script type="text/javascript">
function helloWebkit() {
alert("input:123");
var x = hy.action("123");
alert(x);
}
</script>
</body>
</html>
在该网页上有一个按钮test,点击后会弹出提示“input:123”,并调用hy类中的action方法,传入参数"123"。
将该网页放到DEBUG目录下,并将第2步MainWindow.xaml.cs中的网页地址改为该网页的本地地址:
txtAddress.Text = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName.Replace("EmbeddedWebBrowser.vshost.exe", "index.html");
其中EmbeddedWebBrowser为工程文件名称。
在第3步的WebPageViewer.xaml.cs中,注册了一个JS对象"hy": webView.RegisterJsObject("hy", new CallbackObjectForJs());在 CallbackObjectForJs 类中实现了action方法(该方法名全为小写字母),接收网页上传来的参数,并将处理后的数据返回给网页。
5、在网页加载时显示等待画面
第三步的代码中有用到“MaskLoading ”,MaskLoading.xaml的代码如下所示:
<UserControl x:Class="EmbeddedWebBrowser.MaskLoading"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:EmbeddedWebBrowser"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid Opacity=".85">
<TextBlock Text="页面加载中..." VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</UserControl>
该页面没有任何逻辑,只是为了在网页未加载完成时显示“页面加载中...”的提示信息。后台代码MaskLoading.xaml.cs如下:
using System;
using System.Collections.Generic;
using System.Linq;
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; namespace EmbeddedWebBrowser
{
/// <summary>
/// Interaction logic for MaskLoading.xaml
/// </summary>
public partial class MaskLoading : UserControl
{
/// <summary>
/// 显示等待画面“页面加载中...”
/// </summary>
public MaskLoading()
{
InitializeComponent();
}
}
}
6、其他注意事项
如果编译的时候报错,提示:“无法加载CefSharp.Core.dll组件”,则需要确保电脑上有VC++2013版本的运行库(2010版本是不行的)。运行库的下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=40784。点击红色的DownLoad按钮,选择vcredist_x86.exe。
如果仍然报错,检查代码的生成属性:在工程文件上右击,选择属性——生成,打开如下图所示的界面:
目标平台需要选择“x86”。
2016-04-18补充:若平台下拉框中找不到“x86”,需要按下列步骤进行添加。
若选择了平台x86,运行时仍然报错,则需要将原有的x86平台删除(按下面的步骤打开配置管理器,在活动解决方案平台中选“编辑”,移除x86),再按下面的步骤重新添加。
右击解决方案--属性--配置属性--配置管理器,打开如下图所示的窗体:
aaarticlea/png;base64,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" alt="" />aaarticlea/png;base64,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" alt="" />
新建x86活动平台后,编译程序时,可能目标文件会输出到bin\x86\Debug下。此时需要在工程的属性里,将输出路径改为bin\Debug。
如果是64位机,上述所有的x86都需要改为x64,运行库也需要下载vcredist_x64.exe才行。
Winform应用程序的写法可能会和WPF的有所不同,这里不做讨论。
在WPF程序中打开网页:使用代理服务器并可进行JS交互的更多相关文章
-
WPF中打开网页的两种方法
1.浏览器打开 Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = "http://www. ...
-
WPF程序中App.Config文件的读与写
WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...
-
Android在程序中浏览网页
本文是自己学习所做笔记,欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 有时须要在程序中浏览一些网页.当然了能够通过调用系统的浏览器来打开浏览.可是大多 ...
-
如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来
原文:如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来 title: "如何追踪 WPF 程序中当前获得键盘焦点的元素并显示出来" publishDate: 2019-06 ...
-
在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)
前言: AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等.在C#程序中使用摄像头,我习惯性使用AForge.NET提供的类库.本 ...
-
Win7-其中的文件夹或文件已在另一个程序中打开
Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试”. 步骤阅 ...
-
WPF 程序中启动和关闭外部.exe程序
当需要在WPF程序启动时,启动另一外部程序(.exe程序)时,可以按照下面的例子来: C#后台代码如下: using System; using System.Collections.Generic; ...
-
如何在WPF程序中使用ArcGIS Engine的控件
原文 http://www.gisall.com/html/47/122747-4038.html WPF(Windows Presentation Foundation)是美国微软公司推出.NET ...
-
win10文件夹或文件已在另一程序中打开
我们在对文件或文件夹进行删除.移动.重命名等操作时,系统可能提示“操作无法完成,因为其中的文件夹已在另一程序中打开,请关闭该文件或文件夹,然后重试.”,遇到这种情况我们应该怎么办呢?请看下文. 方法/ ...
随机推荐
-
Windows Live Writer 初次使用
Windows Live Writer 博客园文章的一款发布器,这篇文章就是通过其发布的,可以先在word中写好博客内容,直接粘贴到这里发布就OK,之前我都是先在Word中写好一份,然后在blogs ...
-
BZOJ-1015 StarWar星球大战 并查集+离线处理
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ...
-
使用WINRAR来制作安装程序
1. WINRAR版本 2. 将所有文件放在同一个文件夹下 3. 选中所有文件点击右键 -> Add to archive 4. General设置 5. Advanced 设置 6. 确定开始 ...
-
1964-NP
描述 Problems in Computer Science are often classified as belonging to a certain class of problems (e. ...
-
write &; read a sequence file(基于全新2.2.0API)
write & read a sequence file write & read a sequence file import java.io.IOException; import ...
-
推荐几本C#程序员阅读的书籍
http://www.cnblogs.com/tongming/p/3879752.html
-
ubuntu16.04+eigen3安装
Eigen库安装指南(两种方式)1.apt-get方式(假设默认安装到/usr/local/include里,若实际中默认安装到了/usr/include的话,可以对应替换下面命令的相应部分);运行命 ...
-
几条常见的数据库分页 SQL 语句
SQL Server 先从想要的数据处理加上Row_number()来为数据的row加上一个RowNum作为有多少条数据,然后再用BETWEEN来分隔 with t1 as (select * , ...
-
异常处理与网络基础中的tcp,udp协议
# 异常处理: # 什么是异常?异常和错误的区别 # Error 语法错误 比较明显的错误 在编译代码阶段就能检测出来 # Iteration 异常 在执行代码的过程中引发的异常 # 异常发生之后的效 ...
-
Supervisor 进程管理工具
简介: Supervisor 进程管理工具 一.安装 shell > yum -y install python-pip shell > pip install supervisor # ...