winfrom 窗口支持HTML标签吗,从web页面启动winform程序的实现方法

本文实现的需求是:

A.通过web页面启动winform程序;

B.将页面的参数传递给winform程序;

C.winform程序已经启动并正在运行时,从web页面不能重新启动winform程序,只是当传入winform程序的参数更改时,winform上显示的数据作出相应的更新。

具体实现如下:

1、页面html代码

打开1

打开2

打开3

打开4

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; //事件等待句柄

///

/// 应用程序的主入口点。

///

[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());

}

///

/// 处理页面传回的参数的非法字符

///

///

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

{

///

/// 构造函数

///

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();

}

}

///

/// UI显示初始化

///

void UIinitial()

{

//TODO:UI初始化的处理

}

private void OraAnsMain_Load(object sender, EventArgs e)

{

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值