文档章节

从web页面启动winform程序的实现方法

ggself
 ggself
发布于 2017/06/06 09:58
字数 748
阅读 94
收藏 0

本文实现的需求是:    
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 > 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)
        {            
        }                     
    }
}

 

本文转载自:http://www.cnblogs.com/yuzhihui/p/5547574.html

ggself
粉丝 0
博文 15
码字总数 0
作品 0
东城
私信 提问
史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

1、概述 通过前面几篇文章 史上最全面的SignalR系列教程-1、认识SignalR 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式 史上最全面的SignalR系列教程-3、SignalR...

NET快速开发框架
08/20
0
0
C#进行Visio二次开发之Web端启动绘图客户端并登录

有这样的需求,一个系统,包含Web端的后台和Winform的绘图客户端程序,用户需要在Web端能够启动绘图客户端,并且不需要重新登录(因为已经登录了Web端了)。 那么在IE的Web端,如何启动Winfo...

walb呀
2017/12/04
0
0
SignalR的另类实现技巧

原文:SignalR的另类实现技巧 很久之前发表过一篇名为《通过三个DEMO学会SignalR的三种实现方式》的文章,在那篇文章里面详细介绍了在WEB应用下的常用SignalR实现方法,而今天我们来利用Signa...

杰克.陈
2017/12/15
0
0
RDIFramework.NET Web版介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/43339151 RDIFramework.NET Web版介绍   B/S结构(Browser/Server,浏览器/服...

rdiframework
2015/01/31
0
0
Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程

在上篇随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示》中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的《winform开发框架》的基础上进...

walb呀
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

[top]cpu内存

%Cpu(s): 96.0 us用户进程整理cpu的占比,按整个cpu算。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ......

Danni3
8分钟前
2
0
JavaScript权威指南笔记2

第二章、词法结构 1、字符集 JavaScript程序:Unicode字符集编写 Unicode:ASCII和Latin-1的超集,支持所有在用的语言。 ECMAScript 3要求JavaScript的实现必须支持Unicode 2.1及后续版本 EC...

_Somuns
15分钟前
4
0
数据安全管理:RSA算法,签名验签流程详解

本文源码:GitHub·点这里 || GitEE·点这里 一、RSA算法简介 1、加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用。可以在不直接传递密钥的情况下,完成加解密操...

知了一笑
55分钟前
7
0
Podman 使用指南

> 原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker...

米开朗基杨
今天
6
0
拯救 项目经理个人时间的5个技巧

优秀的项目经理都有一个共同点,那就是良好的时间管理能力。专业的项目经理会确保他们的时间投入富有成效,尽可能避免时间浪费。 时间管理叫做GTD,即Getting Things Done——“把事情做完”...

Airship
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部