从web页面启动winform程序的实现方法
本文实现的需求是:
A.通过web页面启动winform程序;
B.将页面的参数传递给winform程序;
C.winform程序已经启动并正在运行时,从web页面不能重新启动winform程序,只是当传入winform程序的参数更改时,winform上显示的数据作出相应的更新。
具体实现如下:
1、页面html代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<div>
<a href="OraAns://传入exe的参数1">
打开1
</a>
<br>
<a href="OraAns://传入exe的参数2">
打开2
</a>
<br>
<a href="OraAns://传入exe的参数3">
打开3
</a>
<br>
<a href="OraAns://传入exe的参数4">
打开4
</a>
<br>
</div>
</body>
</html>
2、页面启动的程序是通过注册表来启动的
a、通过注册表脚本文件(xxx.reg)操作注册表
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\OraAns]
"URL Protocol"="E:\\Debug\\xxx.exe"
@="OraAnsProtocol"
[HKEY_CLASSES_ROOT\OraAns\DefaultIcon]
@="E:\\Debug\\xxx.exe,1"
[HKEY_CLASSES_ROOT\OraAns\shell]
[HKEY_CLASSES_ROOT\OraAns\shell\open]
[HKEY_CLASSES_ROOT\OraAns\shell\open\command]
@="\"E:\\Debug\\xxx.exe\" \"%1\""
b、通过批处理文件(xxx.bat)操作注册表
reg add HKEY_CLASSES_ROOT\OraAns /ve /t reg_sz /d OraAnsProtocol
reg add HKEY_CLASSES_ROOT\OraAns /v "URL Protocol" /t reg_sz /d “%~dp0OraAns.exe”
reg add HKEY_CLASSES_ROOT\OraAns\DefaultIcon /ve /t reg_sz /d “%~dp0OraAns.exe”,1
reg add HKEY_CLASSES_ROOT\OraAns\shell\open\command /ve /t reg_sz /d "\"%~dp0OraAns.exe\" \"%%1\""
3、winform程序处理页面传入的参数(基于C#)
1)、Program.cs文件代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms; using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Threading; namespace OraAns
{
static class Program
{
public static EventWaitHandle ProgramStarted; //事件等待句柄
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (args.Length > ) //从页面启动时有参数传入,否则直接启动
{
string sParameterValue = Regex.Match(args[], "^[0-9a-zA-Z]+://(.+)$").Groups[].Value;
FilterInvalidCharacter(ref sParameterValue);
Registry.SetValue(@"HKEY_CURRENT_USER\Software\OraAnsParameters", "", sParameterValue); //将经过处理的传入参数写入注册表 bool bIsOrNotCreateNew;
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, "OraAnsClient", out bIsOrNotCreateNew);
if (!bIsOrNotCreateNew)
{
//winform程序已经启动时执行
ProgramStarted.Set();
return;
}
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new OralAnswerMain());
}
/// <summary>
/// 处理页面传回的参数的非法字符
/// </summary>
/// <param name="sParameterValue"></param>
static void FilterInvalidCharacter(ref string sParameterValue)
{
int nStrLength = sParameterValue.Length;
if (nStrLength > )
{
if ('/' == sParameterValue[nStrLength - ])
{
if ( == nStrLength)
{
sParameterValue = "";
}
else
{
sParameterValue = sParameterValue.Substring(, nStrLength - );
}
}
}
}
}
}
2)、winform代码文件的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;using Microsoft.Win32;
using System.Threading; namespace OraAns
{
public partial class OraAnsMain : Form
{
/// <summary>
/// 构造函数
/// </summary>
public OraAnsMain()
{
InitializeComponent();
try
{
//从注册表中获取页面传递过来的参数并解析
object Obj = Registry.GetValue(@"HKEY_CURRENT_USER\Software\OraAnsParameters", "", string.Empty);
if (Obj != null)
{
string sReString = Obj as string;
//TODO:解析从页面传入的字符串参数
}
if (Program.ProgramStarted != null)
{
ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, this, -, false); //注册线程委托
}
}
catch (Exception e)
{
e.ToString();
}
}
public delegate void MyInvoke(); //声明委托
//ThreadPool.RegisterWaitForSingleObject方法执行的回调
void OnProgramStarted(object state, bool timeout)
{
try
{
//通过委托进行异步调用的处理,避免不同线程操作UI线程
MyInvoke mi = new MyInvoke(UIinitial);
this.BeginInvoke(mi, new Object[] { /*UIinitial方法调用的输入参数对象*/ });
}
catch (Exception e)
{
e.ToString();
}
}
/// <summary>
/// UI显示初始化
/// </summary>
void UIinitial()
{
//TODO:UI初始化的处理
}
private void OraAnsMain_Load(object sender, EventArgs e)
{
}
}
}
......
从web页面启动winform程序的实现方法的更多相关文章
- 吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序
在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的 ...
- 如何在网页端启动WinForm 程序
在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的 ...
- C#实现Web链接启动应用程序
C#实现Web链接启动应用程序 最近需要配合Web端实现用户点击链接来启动应用程序并且需要能够传参数给应用程序. 那么就可以使用注册表来实现这个功能 编写注册表可以在软件安装程序中加入,也可以在软件启 ...
- 用JQuery中的Ajax方法获取web service等后台程序中的方法
用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...
- C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service
一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...
- 【问题记录】— web页面调用本地程序
起因: 最近由于项目需要在web页面中调用本地部署的exe程序:进而对该功能实现做了对应了解:以及存在的问题进行记录. 要实现该功能就不得不说浏览器自定义协议:解决办法:那么它是什么呢? 浏览器自定义 ...
- web页面和小程序页面实现瀑布流效果
小程序实现瀑布流效果,和web页面差不多,都要经过以下步骤: 1).加载图片,获取图片的宽高度: 2).根据页面需要显示几列计算每列的宽度: 3).根据图片真实宽度和每列的宽度比,计算出图片需要显示的 ...
- web页面实现文件下载的几种方法
今天碰到文件下载的一些问题,本着知其然也要知其所以然的精神,站在巨人的肩膀上深入学习和测试了一下,抛砖引玉,现在总结结论如下: 1)标准URL下载方式可以通过在web页面中嵌入 url超级链接,标准的 ...
- 打印web页面指定区域的三种方法
本文和大家分享一下web页面实现指定区域打印功能的三种方法,一起来看下吧. 第一种方法:使用CSS 定义一 个.noprint的class,将不打印的内容放入这个class内. 代码如下: <s ...
随机推荐
- tooltip提示插件
tooltip提示信息插件 原理:定位元素在页面中的位置即坐标信息,将显示节点元素插入到body中绝对应为到相应位置,显示内容从指定元素的属性(dataMess)中获取或者通过设置获取. 使用方法: ...
- 《objective-c基础教程》学习笔记(九)—— Foundation框架介绍
在之前的博文中,我们创建的项目文件的时候,默认都有引用#import <Foundation/foundation.h> 这个头文件.但是,之前我们对Foundation都没有展开介绍.这 ...
- [原]OpenGL基础教程(二)多边形绘制
上篇介绍了最基本的三角形绘制,本篇介绍如何使用索引的方式绘制多边行. 为什么要使用索引方式,总体来说提高性能.如何提高:使用顶点数组的好处是避免大量的函数调用.即避免每画一个顶点就调用1次glVert ...
- Maven3路程(三)用Maven创建第一个web项目(2)servlet演示
上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...
- Java中RSA非对称密钥加解密使用示例
一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...
- 聊聊并发(七)——Java中的阻塞队列
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
- cocos2d ios 环境搭建
一.下载cocos2d-x http://cocos2d-x.org/projects/cocos2d-x/wiki/Download cocos2d-x-2.1.4.zip @ June.18, 2 ...
- sys.stdout sys.stderr的用法
stdout:标准输出 stderr:标准错误 print 相当于 sys.stdout.write() + 换行 一个将数据流写入文件的程序,文件名为:main.py def main(out=s ...
- 通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目)
有些时候,需要通过DOS批处理来编译整个项目的JAVA文件:并且编译后还要对Class文件进行打包成jar文件...这还不是最烦的,最烦的是,编译和打包的时候需要依赖其他多个jar文件,困难就这么来了 ...
- 无线路由器WDS 桥接设置方法
假设现在有a b c三台路由器,现在我们把b作为中心路由器,基本的配置之后使其能正常无线上网. 然后: 无线路由器A设置: 1.修改LAN口IP地址.在网络参数-LAN口设置中,修改IP地址和B路由器 ...