1

すべて、実行時に別のアプリケーションを起動する必要があるアプリケーションを開発しています。使用しているサードパーティアプリをSystem.Diagnostics.Process起動し、サードパーティアプリケーションを2回起動しないようにするために、シングルトンパターンを採用しています。

シングルトンが機能している必要がありますが、Process.Start()メソッドは必要ありません。つまりProcess、シングルトンから同じオブジェクトが返されStart()ますが、サードパーティアプリの別のインスタンスを起動しています。

MSDNから-Process.Start()ページ

"Starts (or reuses) the process resource that is specified by the StartInfo property 
of this Process component and associates it with the component."

のインスタンスを再利用する必要があることを提案しますProcess。私は何が欠けていますか?

御時間ありがとうございます。

4

3 に答える 3

1

おそらくProcess.GetProcessesByName、起動しているアプリケーションがすでに実行されているかどうかを理解するためにを使用することを検討する必要があります。

于 2012-05-31T10:14:39.077 に答える
1

サードパーティのアプリケーションを起動するために使用する関数は次のとおりです。

    public static void ProcessStart(string ExecutablePath, string sArgs, bool bWait)
    {
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.EnableRaisingEvents = false;
        proc.StartInfo.FileName = ExecutablePath;

        if(sArgs.Length > 0)
            proc.StartInfo.Arguments = sArgs;


        proc.Start();

        if(bWait)
            proc.WaitForExit();

        if(ProcessLive(ExecutablePath))
            return true;
        else
            return false;               

    }

ExecutablePath:実行可能ファイルへのフルパス

sArgs:コマンドライン引数

bWait:プロセスが終了するのを待ちます

私の場合、二次関数を使用して、プロセスがすでに実行されているかどうかを判断します。これは正確にはあなたが探しているものではありませんが、それでも機能します:

    public static bool ProcessLive(string ExecutablePath)
    {
        try
        {

            string strTargetProcessName = System.IO.Path.GetFileNameWithoutExtension(ExecutablePath);

            System.Diagnostics.Process[] Processes = System.Diagnostics.Process.GetProcessesByName(strTargetProcessName);

            foreach(System.Diagnostics.Process p in Processes)
            {
                foreach(System.Diagnostics.ProcessModule m in p.Modules)
                {
                    if(ExecutablePath.ToLower() == m.FileName.ToLower())
                        return true;
                }
            }
        }
        catch(Exception){}

        return false;

    }
于 2012-05-31T10:19:17.487 に答える
0

次のように使用します

Process[] chromes = Process.GetProcessesByName("ProcessName"); to check whether ur process is already running or not. Based on the u can use the process already running.
于 2012-05-31T10:20:46.120 に答える