本文實現的需求是: A.通過web頁面啟動winform程式; B.將頁面的參數傳遞給winform程式; C.winform程式已經啟動並正在運行時,從web頁面不能重新啟動winform程式, 只是當傳入winform程式的參數更改時,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) { } } }
......