从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 ...
随机推荐
- 【国内独家首发】iPhone4 iOS7不完美越狱教程新鲜出炉
准备工作: 1.Mac (OSX 10.8以上系统): 2.iPhone 4 (iPhone3, 1 iOS 7.0.2): 3.iPhone 4数据线一根: 4.下载越狱工具包:ios7_jb_ki ...
- RHEL 6 或者 Oracle Linux 6, 不关机识别新添加的scsi硬盘
下面看一下在系统不重启的情况,如何让系统认识新的磁盘,并能对其分区与格式化1.在开机状态下新增磁盘2.执行下面的命令 echo "- - -" > /sys/class/sc ...
- JVM -Xss调整Stack Space的大小 【转】
Java程序中,每个线程都有自己的Stack Space.这个Stack Space不是来自Heap的分配.所以Stack Space的大小不会受到-Xmx和-Xms的影响,这2个JVM参数仅仅是影响 ...
- Java Web 工作技巧总结 16.8
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 四时不谢之兰,百节长青之竹,万古不败之石,千秋不变之人. 1. AOP – LOG项目中,一个请 ...
- windows 程序设计自学:添加字符串资源
#include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...
- Web功能之组织结构图
前提:由于项目需要显示组织结构图的形式 工具:VS2010 项目:ASP.NET 自带的web项目 (带模板页) 插件:OrgChart(依赖:OrgChart.dll).JOrgChart 不多说 ...
- MemCached用法
所需要的jar包: com.danga.MemCached.MemCachedClient com.danga.MemCached.SockIOPool 自行下载/** * 缓存服务器集群,提供缓存连 ...
- 使用EntityFramework6连接MySql数据库
准备工具: VS2013.MySQL For VisualStudio 1.1.4.Connector/Net 6.8.3(百度网盘里) 程序包管理器执行命令: Install-Package Ent ...
- Java 监控请求
监控对象 import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Map.Ent ...
- Query Object--查询对象模式(上)
回顾 上两篇文章主要讲解了我对于数据层的Unit Of Work(工作单元模式)的理解,其中包括了CUD的操作,那么今天就来谈谈R吧,文章包括以下几点: 什么是Query Object 基于SQL的实 ...