从web页面起步winform程序的实现方法

从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、页面启动的程序是通过注册表来启动的

xxx.reg操作注册表文件代码

Windows Registry Editor Version 5.00 
[HKEY_CLASSES_ROOT\OraAns] 
"URL Protocol"="E:\\Debug\\xxx.exe" 
@="OralAnswerProtocol" 
[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\""

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_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 > 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_USER\Software\OraAnsParameters", "", 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) { } } }

......