1. 程式人生 > >WPF 利用Process.Start()方法啟動指定路徑下的exe檔案並傳遞引數

WPF 利用Process.Start()方法啟動指定路徑下的exe檔案並傳遞引數

簡單來說就是實現一個程式A 開啟程式B,並且在開啟的時候傳遞一些引數給B,最後在B視窗上顯示出引數,這個小功能也是折騰了我半天。現在把我的過程整理記錄下來。

1.首先我們得有一個被呼叫的程式,新建一個簡單的WPF程式,命名為:argTest。裡面加一個label,用來顯示接收到的引數。直接執行該程式如下:

2.新建一個WPF程式用來啟動我們的argTest.exe程式,命名為call。新增窗體load事件,在load裡呼叫Process.Start()方法。如下

        private void wndLoad(object sender, RoutedEventArgs e)
        {
            string path = "D:\\Project\\WPF-TEST\\argTest\\argTest - 副本\\bin\\Debug\\argTest.exe";
            if (File.Exists(path))
            {
                Process.Start(path);
            }


        }
執行call程式,會彈出兩個視窗,當然現在我們沒有傳遞任何引數。

3.其實要傳引數很簡單,只需要呼叫 Process Start(string fileName, string arguments)這函式即可,難就難在怎麼去接收引數。網上百度一番基本做法是修改被呼叫程式(argTest.exe)的入口函式:

1> 新增新建類Program

2>新增全域性變數,過載MainWindow的建構函式,以便傳遞引數

        string[] recArgs;

        public MainWindow(string[] args)
        {
            InitializeComponent();
            if (args.Length > 0)
            {
                recArgs = args;
            }
        }

3>手動新增帶引數入口Main函式

        [STAThread]
        static void Main(string[] args)
        {
            argTest.App app = new App();
            MainWindow window = new MainWindow(args);
            app.MainWindow = window;
            app.InitializeComponent();
            app.Run();
        }

4>專案屬性設定啟動物件為argTest.Program


4.在argTest專案新增load事件,在load事件裡更改窗體上label的顯示內容。

  private void wndLoad(object sender, RoutedEventArgs e)
        {

            msgLabel.Content = "接收到的引數是:";
            string temp = "";
            if (recArgs.Length > 0)
            {
                //拼接引數
                for (int i = 0; i < recArgs.Length; i++)
                {
                    temp += recArgs[i] + " ";
                }
                msgLabel.Content = msgLabel.Content + temp;
            }
5.將call程式中原來load函式裡的  Process.Start(path); 替換為 Process.Start(path,"this is a test");

6.重新生成argTest後,執行call。你會發現引數依然沒有傳遞到argTest窗體,這是為什麼呢?(可以自己先做測試找問題)

   是沒有呼叫我們過載的建構函式嗎?

   在建構函式裡新增Message.show(args[0]);你會發現是呼叫了建構函式的,且能打印出值“this”。說明引數是傳遞進去了,並且以空格區分引數。

   引數既然傳遞進去了,那為什麼會在視窗上沒有顯示出來呢?去掉建構函式裡的列印,我們再在load方法裡列印recArgs的長度,居然沒有打印出來,我們該了入口函式不會      連load函式也不進入了吧。直接MessageBox.Show(“進入load”);發現是會進入load的。為什麼沒有打印出recArgs的長度來呢? 把它放在try{}catch{} 裡 你會發現recArgs居然      是報null錯誤,那麼這裡只可能是recArgs為null,在前面我們已經打印出來了  引數確實傳遞進來了,為什麼recArgs還會為null呢?(你可以自己驗證一下)




為了找到這個原因,在argTest程式裡所有函式和變數均打上一個端點,直接執行,你會發現一個奇怪的問題預設建構函式也會被執行,全域性變數會被定義兩次。這就能解釋為什麼recArgs為null了。但為什麼會執行兩次呢?我在手動新增的入口函式裡面增加斷點單步執行,發現預設建構函式是在執行app.Run()的時候被呼叫的。檢視官方文件,原來Run方法會呼叫 Application的OnStartup方法,在該方法中會再次呼叫MainWindow的預設建構函式。所以我們要繼承Application類重寫OnStartup方法。

namespace argTest
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            CustomApplication app = new CustomApplication();
            //MainWindow window = new MainWindow(args);
            //app.MainWindow = window;
            app.Run();
        }
    }
    class CustomApplication : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            MainWindow window = new MainWindow(e.Args);
            window.Show();
        }
    }
}
現在直接執行  你會發現不會執行預設建構函式。  現在刪除所有列印程式碼執行call程式就沒有問題了


完工

本來想設定0資源分下載,現在資源必須選擇下載資源分。。。。。

相關推薦

WPF 利用Process.Start()方法啟動指定路徑exe文件傳遞參數接收參數

name 位置 處理 指定路徑 public AR res ini pri WPF 利用Process.Start()方法啟動指定路徑下的exe文件並傳遞參數接收參數 在開發中遇到這樣一個需求:WPF程序A啟動WPF程序B並且傳遞參數,WPF程序B接收參數並處理。

WPF 利用Process.Start()方法啟動指定路徑exe檔案傳遞引數

簡單來說就是實現一個程式A 開啟程式B,並且在開啟的時候傳遞一些引數給B,最後在B視窗上顯示出引數,這個小功能也是折騰了我半天。現在把我的過程整理記錄下來。 1.首先我們得有一個被呼叫的程式,新建一個簡單的WPF程式,命名為:argTest。裡面加一個label,用來顯示接

python實現將某程式碼檔案複製/移動到指定路徑檔案、資料夾的移動、複製、刪除、重新命名)

    用python實現將某程式碼檔案複製/移動到指定路徑下。 場景例如:mv ./xxx/git/project1/test.sh ./xxx/tmp/tmp/1/test.sh (相對路徑./xxx/tmp/tmp/1/不一定存在)   # -

java 刪除指定路徑檔案

import java.io.File;import java.util.Scanner; public class deleteFile{     /**      * @param args      */     public static void main(St

android 獲取指定路徑所有檔案,將檔案從一個目錄copy到另一個目錄,執行linux命令

/** * 複製整個資料夾內容 ,可以從data/data/包名下 拷貝到 data/data/包名下。也可以copy到 /sdcard 下 * @param oldPath String 原檔案路徑 如:c:/fqf

遞迴列印指定路徑所有檔案內容到指定檔案

# -*- coding: utf-8 -*- """遞迴列印指定路徑下所有檔案 Usage: printDirectory <printFilePath> <saveFilePath> """ from docopt import docopt imp

Python實現遍歷指定路徑檔案列印加入列表

直接上程式 # -*- coding: utf-8 -*- import os file_path_list = []# 列表用於存放路徑 def traverse(folder_path):

java 顯示指定路徑檔案或者刪除指定路徑的全部檔案

顯示指定目錄下的檔案(運用遞迴再來訪問資料夾)package com.JavaIO; import java.io.*; public class ShowDirTest { public stati

node.js+react全棧實踐-Form中按照指定路徑上傳檔案

書接上回,講到“使用同一個新增彈框”中有未解決的問題,比如複雜的欄位,檔案,圖片上傳,這一篇就解決檔案上傳的問題。這裡的場景是在新增彈出框中要上傳一個圖片,並且這個上傳元件放在一個Form中,和其他文字欄位一起提交給介面。 這裡就有幾個要注意的問題: 圖片上傳時最好能在前端指定

初識TypeScript:查詢指定路徑檔案按型別生成json

如果開發過node.js的話應該對js(javascript)非常熟悉,TypeScript(以下簡稱ts)是js的超集。 下面是ts的官網: https://www.tslang.cn/   1.環境配置(如果已經進行過環境配置,可以跳過此步) 開發ts需要先簡單的配置開發環境,如果使用的是Vis

VBS 下載指定URL地址EXE檔案執行命令:

set xPost = createObject("Microsoft.XMLHTTP") xPost.Open "GET","http://down.xxsafe.com/setup.exe",0 xPost.Send() Set sGet = createObjec

C# Process.Start()方法詳解

stat 字符串 檔案 atd 一個 用戶名 菜單 簡單介紹 run System.Diagnostics.Process.Start(); 能做什麽呢?它主要有以下幾個功能: 1、打開某個鏈接網址(彈窗)。 2、定位打開某個文件目錄。 3、打開系統特殊文件夾,如“控制面板

fullfile+利用matlab讀取指定路徑的影象

<span style="font-family:Times New Roman;">% 讀入指定路徑imgFolder下的影象imgName imgFolder = 'F:\博\快盤\影象+資料\images\文章實驗圖'; %指定路徑 imgName = 'tile3_24.png'; %指

C# Process.Start方法

-s param mms int 命令行 install ont 更多 word System.Diagnostics.Process.Start(); 主要功能: 1、打開某個鏈接網址(彈窗)。 2、定位打開某個文件目錄。 3、打開系統特殊文件夾,如“

抓取指定路徑所有文檔名

mds 所有 -- 2.6 div ast txt rom char --方法1: EXEC xp_dirtree ‘\\172.6.6.6\D$\TEXT\‘,1,1 --方法2: CREATE TABLE #TXT_Name (NAME VARCHAR( 2000)

掃描指定路徑的全部請求路徑(基於SpringMVC)

ada access cto url ssm private 博客 ble ack 通過上面兩篇博客,我們能夠得到指定類上的全部請求路徑。現在需要的是,給定一個指定的路徑,獲取全部的請求路徑。 public class RequestUrlScannerHelper {

刪除指定路徑指定天數之前(以文件的最後修改日期為準)的文件:BAT + REG + VBS

2.0 ane blog set logo fmt 演示 back style @echo off ::演示:刪除指定路徑下指定天數之前(以文件的最後修改日期為準)的文件。 ::如果演示結果無誤,把del前面的echo去掉,即可實現真正刪除。 ::本例調用了臨時VBS代碼

Python3在指定路徑遞歸定位文件中出現的字符串

裝飾器 post sea 搜索 ima all entry syntax sys [本文出自天外歸雲的博客園] 腳本功能:在指定的路徑下遞歸搜索,找出指定字符串在文件中出現的位置(行信息)。 用到的python特性: 1. PEP 318 -- Decorators

python筆記之按文件名搜索指定路徑的文件

join 目錄 utf-8 range roo 圖片路徑 brush info rom 1.搜索文件名中以指定的字符串開頭(如搜索dll,結果中含有dll a,dll abc等) 我的目錄下有dll a.txt和dll.txt文件 其中a文件夾下還有這兩個文件 我希

遞歸刪除指定路徑的空目錄

removedirs遞歸刪除指定路徑下的空目錄: 註:如第一級目錄要保留 vi a1.py #!/usr/bin/python import os dir="/root/python" os.chdir(dir) for f in os.listdir(dir):if os.path.is