web頁面啟動winform程式的實現方法

来源:http://www.cnblogs.com/yuzhihui/archive/2016/05/31/5547574.html
-Advertisement-
Play Games

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

......


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MSDN中的描述: Visual Studio 項目對程式的發佈和調試版本分別有單獨的配置。顧名思義,生成調試版本的目的是用於調試,而生成發佈版本的目的是用於版本的最終分發。 如果在 Visual Studio 中創建程式,Visual Studio 將自動創建這些配置並設置適當的預設選項和其他設置 ...
  • 概述 當方法返回類型或屬性類型為集合時,有些開發者會千篇一律地使用IList集合。然而IList具有集合的所有操作,這意味著調用者不僅可以讀取集合信息,還能夠修改集合。業務需求本來只是為調用者提供一個可讀的集合,例如數據的查詢和展示,但當方法返回IList時,無疑隱式地開放了集合可寫的許可權。此時,我... ...
  • 之前由於剛入行不久,對數據持久化不是很瞭解,尤其是用資料庫存儲大量數據的操作。經過摸索就在此總結一下,方便以後查閱 下麵就簡單介紹一下: 1.NSUserDefaults 感覺最常用的小量數據,屬性,例如,賬號,密碼之類的;適合存儲輕量級的本地數據 (個人認為這種比較簡單) NSUserDefaul ...
  • 前面學起來還是很順的,畢竟很多都接觸過。 後面學起來只能用“磨”來形容,以至於八章用了2個月。(當然也有相當一些原因是這兩個月中發生了一些個人生活上的問題) 總的來說收穫超大,這種感覺就像大一的時候學習老譚的C語言一樣,醍醐灌頂。 如果是靠.NET吃飯的人,不讀這本書真的是太可惜了。 不過這中間也出 ...
  • 上一章講了基元線程同步構造,而其它的線程同步構造都是基於這些基元線程同步構造的,並且一般都合併了用戶模式和內核模式構造,我們稱之為混合線程同步構造。 在沒有線程競爭時,混合線程提供了基於用戶模式構造所具備的性能優勢,而多個線程競爭一個構造時,混合線程通過基元內核模式的構造來提供不“自旋”的優勢。 那 ...
  • N年沒有寫博客,發個進位轉換的玩下,支持負數;功能屬於簡化版的 Convert.ToInt32 ,特點是: 1、任意位,如:0,1(二進位),0...7(八進位),0...9,A...F(16進位),0...N(N進位),或者是:!@#$%^&*(8進位,字元符號),也可以是中文。 2、8 byte ...
  • 前端工程師技能整理 一、框架與組件 bootstrap等UI框架設計與實現 伸縮佈局:grid網格佈局 基礎UI樣式:元素reset、按鈕、圖片、菜單、表單 組件UI樣式:按鈕組、字體圖標、下拉菜單、輸入框組、導航組、麵包屑、分頁、標簽、輪播、彈出框、列表、多媒體、警告 響應式佈局:佈局、結構、樣式... ...
  • 標簽:GC .Net C CLR "前言" "1. 基礎概念明晰" "1.1 公告語言運行時" "1.2 托管模塊" "1.3 對象和類型" "1.4 垃圾回收器" "2. 垃圾回收模型" "2.1 為什麼需要垃圾回收" "2.2 什麼時候進行垃圾回收" "2.3 垃圾回收時發生了什麼" "2.4 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...