看到这个标题是否感觉奇怪,为什么要用IE浏览器打开chorme或者火狐浏览器等,这个功能从开发者来说不是一个好的需求,但确实是真实存在的,有用公司的背景历史比较复杂,而且公司有过长期的开发历史,这导致了公司有许多各种功能的系统,而且有用开发时间、语言、版本兼容性等问题的存在,所以有一个总的汇总页面,页面上放了各大系统的图标和链接,但是各系统各自自能在特点的浏览器或版本上跑。所以有这个妥协下的需求(我的内心是拒绝的)。

拿到这个需求,分析上来说浏览器本身并不具备打开其他浏览器的功能,所以只能借助其他方式,我们知道在winform中存在一个System.Diagnostics.Process类,使用它的Start()方法可以打开各种应用程序,由Start()所带的5各重载方法可以使用各种功能,所以我们可以从中选择自己需要的方法来使用。

代码如下

 string mathonPath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";
System.Diagnostics.Process p = new System.Diagnostics.Process(); //设定程序名
p.StartInfo.FileName = mathonPath;
p.StartInfo.Arguments = @"https://www.baidu.com/";
p.Start();

Start()可以打开其他应用,那么我们要解决的问题就是做一个winform或者windows服务并让我们的IE和它们之间相互通讯,在IE上所幸我们的版本可以使用websocket,那就拿来借鉴引用一下。示例代码:

 <!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<script>
var socket;
window.onload = function () {
connectSocketServer();
}
function connectSocketServer() {
// 创建一个Socket实例
socket = new WebSocket('ws://localhost:10245'); // 打开Socket
socket.onopen = function (event) { // 发送一个初始化消息
socket.send('I am the client and I\'m listening!'); // 监听消息
socket.onmessage = function (event) {
console.log('Client received a message', event);
}; // 监听Socket的关闭
socket.onclose = function (event) {
console.log('Client notified socket has closed', event);
}; // 关闭Socket....
//socket.close()
};
}
function sendMessage() {
if (socket) {
var messageBox = document.getElementById('messageBox');
socket.send(messageBox.value);
messageBox.value = "";
} else {
alert("连接断开");
}
}
</script>
</head>
<body>
<ul>
<li><textarea></textarea></li>
<li><textarea id="messageBox"></textarea></li>
<li><button id="sendbtn" onclick="sendMessage()">SendMSG</button></li>
</ul>
</body>
</html>

Web代码

在winform或windows服务端,我们使用superwebsocket做接收端使用。示例代码:

 WebSocketServer server;
private void startBtn_Click(object sender, EventArgs e)
{
var ip = "127.0.0.1";
var port = "";
//WebSocket服务器端启动
server = new WebSocketServer();
if (!server.Setup(ip, int.Parse(port)))
{
Debug.Write("WebSocket服务器端启动失败");
//处理启动失败消息
return;
} //新的会话连接时
server.NewSessionConnected += server_NewSessionConnected;
//会话关闭
server.SessionClosed += server_SessionClosed;
//接收到新的消息时
server.NewMessageReceived += server_NewMessageReceived; if (!server.Start())
{
Debug.Write(string.Format("开启WebSocket服务侦听失败:{0}:{1}", server.Config.Ip, server.Config.Port));
//处理监听失败消息
return;
}
Debug.Write("WebSocket服务器端启动成功");
}
string KSessionId;
string VSessionId;
Dictionary<string, List<string>> msgDictionary = new Dictionary<string, List<string>>();
private void server_NewMessageReceived(WebSocketSession session, string value)
{
Debug.WriteLine("接收到新的消息:{0} 来自:{1} 时间:{2:HH:MM:ss}", value, session.RemoteEndPoint, DateTime.Now);
if (value.StartsWith("K"))
{
KSessionId = session.SessionID;
//页面已链接
if (!String.IsNullOrEmpty(VSessionId))
SendMsgToRemotePoint(VSessionId, string.Format("发来消息:{0}", value));
//页面未链接
else
{
AddMsgToSessionId(VSessionId);
}
} } /// <summary>
/// 添加会话消息
/// </summary>
/// <param name="value"></param>
private void AddMsgToSessionId(string value)
{
if (value != null)
{
//消息列表包含页面会话ID
if (msgDictionary.ContainsKey(value))
{
msgDictionary[value].Add(value);
}
//消息列表不包含页面会话ID
else
msgDictionary.Add(value, new List<string>() { value });
}
} /// <summary>
/// 会话关闭
/// </summary>
/// <param name="session"></param>
/// <param name="value"></param>
private void server_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{
Debug.WriteLine("会话关闭,关闭原因:{0} 来自:{1} 时间:{2:HH:MM:ss}", value, session.RemoteEndPoint, DateTime.Now);
if (session.SessionID == KSessionId)
SendMsgToRemotePoint(VSessionId, "已断开");
else if (session.SessionID == VSessionId)
SendMsgToRemotePoint(KSessionId, "已断开");
} /// <summary>
/// 新的会话链接
/// </summary>
/// <param name="session"></param>
private void server_NewSessionConnected(WebSocketSession session)
{
Debug.WriteLine("新的会话连接 来自:{0} SessionID:{1} 时间:{2:HH:MM:ss}", session.RemoteEndPoint, session.SessionID, DateTime.Now);
if (msgDictionary.ContainsKey(session.SessionID))
msgDictionary[session.SessionID].ForEach(item => session.Send(item));
} /// <summary>
/// 发送消息到
/// </summary>
/// <param name="sessionId"></param>
/// <param name="msg"></param>
private void SendMsgToRemotePoint(string sessionId, string msg)
{
var allSession = server.GetAppSessionByID(sessionId);
if (allSession != null)
allSession.Send(msg);
}

winform代码

查看上面代码,修改下自己的规则,并优化下路径问题即可拿来使用,在项目实施的时候更改下浏览器的路径即可。

System.Diagnostics.Process还有许多其他的妙用,如另外一个需求:启动一个自己开发的程序后打开QQ,这时就需要你同样使用这个方式。

IE浏览器打开chorme浏览器,如何打开其他浏览器的更多相关文章

  1. 在IE中点击转跳,并打开chorme浏览器继续浏览指定页面,IE自定义ocx控件开发

    因项目需要,需要开发一个功能:在IE中点击转跳,并打开chorme浏览器继续浏览指定页面. 分析需求后,参考了: https://www.cnblogs.com/ffjiang/p/7908025.h ...

  2. 移动浏览器H5页面通过scheme打开本地应用

    在移动端浏览器H5页面中,点击按钮打开本地应用主要通过 scheme 协议.本文主要介绍如何在浏览器H5页面中通过 scheme 协议打开本地应用. scheme协议定义 scheme 是一种页面之间 ...

  3. 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数

    需求: 在Chrome浏览器中点击链接,打开IE浏览器,跳转到指定页面并传递参数 过程: 一些应用软件可以通过点击URL链接启动并执行操作(例如迅雷),这是如何做到的呢? 主要是通过修改注册表,注册U ...

  4. 微信打开手机内置浏览器跳转手机默认浏览器打开html网页

    微信上进行的网页宣传.游戏传播.APP下载各类活动很多,但是各位朋友肯定经常会遇到一些特殊需求,网页需要在手机默认浏览器打开而不是微信内置浏览器.这个问题怎么解决呢? 斗在微信营销的浪潮中 解决方案: ...

  5. 用JS打开新窗口,防止被浏览器阻止的方法

    相信做web前端或者使用JS的朋友都会遇到需要在新窗口打开页面的情况,现在浏览器大都具有弹出窗口拦截功能,所以传统的window.open()不再那么好用了.借鉴于网上查到的方法和我个人的实践,把弹出 ...

  6. 爬虫模块介绍--selenium (浏览器自动化测试工具,模拟可以调用浏览器模拟人操作浏览器)

    selenium主要的用途就是控制浏览器,模仿真人操作浏览器的行为 模块安装:pip3 install selenium 需要控制的浏览器 from selenium import webdriver ...

  7. Web 2.0 浏览器端可靠性测试第1部分(浏览器端可靠性测试的概念和背景)

    Web 2.0 是一个体现当代网络技术发展趋势的流行概念.它使得基于 Web 的信息交互和用户间协作性更加灵活和丰富.很多的社交网站.博客.wiki,都是 Web 2.0 技术的典型应用. 我们知道, ...

  8. 浏览器控制之 selenium,phantomJs谷无头浏览器

    目录 浏览器控制之 selenium,phantomJs谷无头浏览器 selenium phantomJs 需求是尽可能多的爬取豆瓣网中的电影信息 谷歌无头浏览器 浏览器控制之 selenium,ph ...

  9. 【转】javascript浏览器参数的操作,js获取浏览器参数

    原文地址:http://www.haorooms.com/post/js_url_canshu html5修改浏览器地址:http://www.cnblogs.com/JiangXiaoTian/ar ...

随机推荐

  1. 20个高级Java面试题汇总

    程序员面试指南:https://www.youtube.com/watch?v=0xcgzUdTO5MJava面试问题集合指南:https://www.youtube.com/watch?v=GnR4 ...

  2. 【iOS [[UIApplication sharedApplication] delegate]】运用

    之前想要拿到app的窗口,我们通常的写法是: [UIApplication sharedApplication].keyWindow 这种写法之前一直也觉得是正确的,没什么问题,而且网上大多数的博客或 ...

  3. mongoose数据库连接和操作

    var mongoose = require('mongoose') mongoose.connect('mongodb://localhost:27017/hometown'); var db = ...

  4. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  5. 2016-2-10 tomcat基础学习

    安装tomcat服务器(1)配置 JAVA_HOME指向你的jdk主目录 也可以在startup.bat文件中设置JAVA_HOME环境变量. 首次使用JAVA_HOME前设置即可.set JAVA_ ...

  6. SOAPUI使用教程-测试JDBC数据库

    soapUI中有除了开源版本的一些非常实用的功能: 使用在项目级配置的JDBC连接 使用向导创建复杂的查询. 结果显示XML输出视图(以及该使用向导在此视图中提供的XPath断言). 提供JDBC连接 ...

  7. Lua 排行榜更新

    排行榜: key:玩家名字,val:玩家的数值 local key1 = {"a1", "a2", "b1", "b2" ...

  8. Leetcode Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...

  9. [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)

    先列出题目: 1.POJ 1753 POJ 1753  Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...

  10. BZOJ‘s Usaco 奶牛题集锦

    1230 线段树 1231 状压DP 1232 最小生成树 1527 贪心 1600 打表找规律 1601 最小生成树 1602 prime 1606 DP 1607 筛法 1609 DP 1610 ...