本文实现的需求是:
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 ...
随机推荐
-
ListView的LayoutParams设置
// Temp is the root view that was found in the xml final View temp = createViewFromTag(root, name, a ...
-
android的二进制和十六进制的相互转换工具类(一):
二进制和十六进制的相互转换工具类: package com.gzcivil.utils; public class BinStr { /** * 将二进制转换成16进制 * @param buf * ...
-
PAT (Advanced Level) 1066. Root of AVL Tree (25)
AVL树的旋转.居然1A了.... 了解旋转方式之后,数据较小可以当做模拟写. #include<cstdio> #include<cstring> #include<c ...
-
MFC界面分割以及挂载
MFC中文档与视图(二) Last Edit 2013/11/19 这篇主要是介绍一下怎么去分割视图. 视图的分割分为:动态分割,静态分割.所谓的静态分割是指软件一启动视图就分割完成,而动态分割是在 ...
-
c++中的log函数
引入#include<cmath> 以e为底:log(exp(n)) 以10为底:log10(n) 以m为底:log(n)/log(m)
-
react实例:理解dva构建项目的原理
请点击相应的步骤查看详情 我们首先搭建一个 dva Demo 项目(请参考react快速构建一个应用项目),然后逐步完成以下内容: 结构划分 设计 Model 组件设计方法 组件设计实践 添加 Re ...
-
字符串使用replaceAll()方法报异常
对字符串使用replaceAll()方法替换 * ? + / | 等字符的时候会报以下异常 Dangling meta character '*' near index 0 这主要是因为这些符号在正则 ...
-
浅谈无缓存I/O操作和标准I/O文件操作差别
首先,先略微了解系统调用的概念: 系统调用,英文名system call,每一个操作系统都在内核里有一些内建的函数库,这些函数能够用来完毕一些系统系统调用把应用程序的请求传给内核,调用对 ...
-
python 反射 动态导入模块 类attr属性
1.反射 hasattr getattr delattr setattr 优点:事先定义好接口,接口只有在被完成后才能真正执行,这实现了即插即用,这其实是一种“后期绑定”,即先定义好接口, 然后是再去 ...
-
【JavaScript】table显示问题
table有时显示出问题,解决办法如下: 添加<thead></thead>和<tbody></tbody>在table的外面添加<div> ...