本文实现的需求是:
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_ROOTOraAns] "URL Protocol"="E:\Debug\xxx.exe" @="OraAnsProtocol" [HKEY_CLASSES_ROOTOraAnsDefaultIcon] @="E:\Debug\xxx.exe,1" [HKEY_CLASSES_ROOTOraAnsshell] [HKEY_CLASSES_ROOTOraAnsshellopen] [HKEY_CLASSES_ROOTOraAnsshellopencommand] @=""E:\Debug\xxx.exe" "%1""
b、通过批处理文件(xxx.bat)操作注册表
reg add HKEY_CLASSES_ROOTOraAns /ve /t reg_sz /d OraAnsProtocol reg add HKEY_CLASSES_ROOTOraAns /v "URL Protocol" /t reg_sz /d “%~dp0OraAns.exe” reg add HKEY_CLASSES_ROOTOraAnsDefaultIcon /ve /t reg_sz /d “%~dp0OraAns.exe”,1
reg add HKEY_CLASSES_ROOTOraAnsshellopencommand /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 > 0) //从页面启动时有参数传入,否则直接启动 { string sParameterValue = Regex.Match(args[0], "^[0-9a-zA-Z]+://(.+)$").Groups[1].Value; FilterInvalidCharacter(ref sParameterValue); Registry.SetValue(@"HKEY_CURRENT_USERSoftwareOraAnsParameters", "", 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 > 0) { if ('/' == sParameterValue[nStrLength - 1]) { if (1 == nStrLength) { sParameterValue = ""; } else { sParameterValue = sParameterValue.Substring(0, nStrLength - 1); } } } } } }
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_USERSoftwareOraAnsParameters", "", string.Empty); if (Obj != null) { string sReString = Obj as string; //TODO:解析从页面传入的字符串参数 } if (Program.ProgramStarted != null) { ThreadPool.RegisterWaitForSingleObject(Program.ProgramStarted, OnProgramStarted, this, -1, 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) { } } }
......