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
            </a>
        <br>
            <a href="OraAns://传入exe文件的参数">
                打开2
            </a>
        <br>
              <a href="OraAns://传入exe文件的参数">
                打开3
            </a>
        <br>
             <a href="OraAns://传入exe文件的参数">
                打开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)
        {
        }
    }
}

......

时间: 2024-10-29 19:06:31

web页面启动winform程序的相关文章

吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序

原文:吉特仓库管理系统(开源)-如何在网页端启动WinForm 程序 在逛淘宝或者使用QQ相关的产品的时候,比如淘宝我要联系店家点击旺旺图标的时候能够自动启动阿里旺旺进行聊天.之前很奇怪为什么网页端能够自动启动客户端程序,最近在开发吉特仓储管理系统的时候也遇到一个类似的问题,因为使用网页端的打印效果并不是太好,之前也写过关于打印相关的文章可以查阅,我需要使用WinForm客户端来驱动打印,但是我又不想重新开发Winform客户端的所有功能,只要能够使用winform驱动打印即可.我就需要一个类似

C# windows服务启动winform程序不显示UI问题解决

由于工作需要写一个解决winform程序自动更新下载重启的自动更新程序,之前用控制台全部实现,然而换成windows  service出现了两个问题,一个是路径问题(http://baidu.com),一个是服务启动其他winform程序不显示UI问题. 本篇解决UI显示问题. 以下为引用尤尼博文(原文地址:http://www.cnblogs.com/luxilin/p/3347212.html): 我开发的系统中有一接口程序(这里就称Task,是一个C#的Console Applicatio

从web启动winform程序

最近有个客户提出想从网站上启动一个客户端的程序,研究了下,实现方法如下: 1. 注入注册表 try { string appPath = "\"" + Application.ExecutablePath + "\" \"%1\""; string strKey = Application.ProductName; string strKey_shell_open_cmd = strKey + @"\shell\op

安装winform程序时自动安装windows服务

项目中遇到一个需求:安装winform程序时自动安装windows服务,且windows服务运行时反过来检测winform程序是否启动.如果没有则启动. 经过一番查阅已在win10下实现并运行正常.在此记录便于以后查看 实现思路:利用打包插件VS installer 有一个自定义操作,可以指定安装完成后运行的程序集,并在程序集中默认启动一个windows服务安装类 实现步骤:1.在winform程序所在解决方案中,添加一个vs installer打包项目, vs installer的使用不再累述

(转)通过自定义URL协议在Web中启动本地应用程序

通过自定义URL协议在Web中启动本地应用程序 1.注册应用程序来处理自定义协议 你必须添加一个新的key以及相关的value到HKEY_CLASSES_ROOT中,来使应用程序可以处理特殊的URL协议. 新注册的key必须与协议scheme相匹配才可以被添加.例如,增加一个“alert:”协议,被增加到HKEY_CLASSES_ROOT的key必须是alert.在这个新的key之下,默认的字符串value将显示新协议的名字,并且URL协议字符串value将包含协议特有的信息或者空字符串.Key

Android程序中Web页面和NativeCode交互

首先应该在AndroidManifest.xml把下面这个加上使得具有网络访问权限 <uses-permission android:name="android.permission.INTERNET"/> 然后在布局文件上插入WebView main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

C# WinForm程序中强制退出程序以及启动程序

C# WinForm程序 退出方法: Application.Exit();//强制所有消息终止,退出所有窗体,但是若有托管线程(非主线程),也无法干净地退出this.Close();//只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,但是若有托管线程(非主线程),也无法干净地退出Application.ExitThread();//强制终止调用线程上的所有消息,同样面临其他线程无法正确退出的问题System.Environment.Exit(0);//这是最彻底的退出,不管什么线程都被强

WinForm程序启动控制台窗口Console

本文转载:http://blog.csdn.net/oyi319/article/details/5753311 2.WinForm程序和控制台窗口Console 如果你调试过SharpDevelop的源程序,会发现它在DEBUG模式时会出现一个控制台窗口,以显示日志信息.或许我使用的方法与其不同,不过你可以试一试,写出我们自己的调试日志代码. 首先要解决的问题是如何在Debug模式时显示Console窗口.我确定,这是一个WinForm项目,也没有改过它的输出类型.我们需要在项目的入口点使用一

C# winForm程序开机启动和托盘显示 (转http://blog.csdn.net/xinyue3054/article/details/6599508)

这段时间一直进行cs项目,故整理下开机自动运行.托盘.显示.隐藏. (1).在窗口上点击关闭按钮或者最小化时将托盘显示: (2).双击托盘图标显示窗口: (3).右键点击托盘图标提供三个菜单选项,“退出”.“隐藏”.“显示”: (4).程序可以设置开机启动,隐藏任务栏显示.就这四个小功能. 1.建一个WinForm程序—FormAuto,将其属性ShowInTaskbar改为false,这样程序将不会在任务栏中显示:将MaximizeBox属性设置为false,屏蔽掉最大化按钮:把StartPo