• 从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_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_ROOT
    OraAnsshellopencommand /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) { } } }

    ......

  • 相关阅读:
    【视频教学】Maclean教你用Vbox在Linux 6.3上安装Oracle 11gR2 RAC
    了解你所不知道的SMON功能(十二):Shrink UNDO(rollback) SEGMENT
    大叔问题定位分享(41)logstash消费kafka延迟
    大叔经验分享(122)linux系统蓝牙失效
    大叔问题定位分享(42)yarn被利用提交getshell任务挖矿
    大叔问题定位分享(43)hbase大面积重启
    arcgis 栅格转Point点
    arcgis建立渔网(fishnet)
    Docker容器:将带UI的程序直接转为Web应用,so easy
    架构漫谈(五):什么是软件
  • 原文地址:https://www.cnblogs.com/yuzhihui/p/5547574.html
Copyright © 2020-2023  润新知