C#Winフォームは、プログラムを説明するために、いくつかの方法のインスタンスを1つだけ実行することが許可されている解決します

C#Winフォームは、プログラムを説明するために、いくつかの方法のインスタンスを1つだけ実行することが許可されている解決します

相互に排他的なプログラムを達成するために、通常達成するために、次のC#言語を使用して、いくつかの方法がある:
方法1:
使用mutex変数を定義することにより、実行中のインスタンスかどうかを判断するためのスレッドが相互に排他的な変数が。
メインのProgram.csの文書は、 ()関数は、以下のコードで置き換えられています。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace NetTools{
    static class Program{

        [DllImport("user32.dll")]
        private static extern bool FlashWindow(IntPtr hWnd, bool bInvert);

        [DllImport("user32.dll")]
        private static extern bool FlashWindowEx(int pfwi);

        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(){
            bool runone;
            System.Threading.Mutex run = new System.Threading.Mutex(true, "single_test", out runone);
            if (runone){
                run.ReleaseMutex();
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                FrmRemote frm = new FrmRemote();
                int hdc = frm.Handle.ToInt32(); // write to ...
                Application.Run(frm);
                IntPtr a = new IntPtr(hdc);
            } else {
                MessageBox.Show("已经运行了一个实例了。");
                //IntPtr hdc = new IntPtr(1312810); // read from...
                //bool flash = FlashWindow(hdc, true);
            }
        }
    }
}

定義:ステートメントSystem.Threading.Mutexラン=新しいSystem.Threading.Mutexことで(真、RUNONEうち、 "single_test");

mutex変数の実行、「single_test」などの名前のミューテックスを作成するには、

ときにこのメソッドが戻ると、ミューテックスまたは作成ローカル・ネーミング・システムは、ミューテックスを指定した場合、その後、ブールRUNONEが真です。

名前付きシステムミューテックスを指定した場合は、既に偽、存在しています。

名前付きミューテックスは、システム全体です。

 


方法2:作動位置が同じプロセスである間、あなたがC#システムでアプリケーションを実行しない場合、我々はプログラムを実行する前に、プロセス内の同じ名前のプロセスがあるかどうかを調べる、道の判定処理を使用して、ケースには、プログラムを実行していません。..次のようにメインのコードを実装するためのプロセス診断の名前空間のクラスがある: 
1 、でのProgram.cs ファイル機能を追加し、次のとおりです。

  パブリック静的System.Diagnostics.Process RunningInstance(){

            System.Diagnostics.Process電流= System.Diagnostics.Process.GetCurrentProcess()。

            System.Diagnostics.Process []プロセス= System.Diagnostics.Process.GetProcesses()。

            foreachの(プロセスにおけるSystem.Diagnostics.Processプロセス)//同じ名前のプロセスを見つけます{

                //(process.Id!= current.Id)場合は、現在のプロセスを無視します

                {//同じプロセス走行位置が同じであることを確認します。

                    もし(System.Reflection.Assembly.GetExecutingAssembly()。Location.Replace( "/"、@ "/")== current.MainModule.FileName)

                    {//他のプロセスのインスタンスを返します。

                        プロセスを返します。

                    }

                }

            } //他のインスタンスがない場合はnull、見つかりませんでした。

            ヌルを返します。

        }

 

2 メイン()関数は、以下のコードで置き換えられています。

静的な無効メイン()

        {

            もし(RunningInstance()== nullの)

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(偽);

                Application.Run(新しいForm1の());

            }

            そうしないと

            {

                ます。MessageBox.Show(「のインスタンスを実行してきました。」);

            }

        }

 

 

 

方法3:グローバルアトムの方法は、プログラムを作成する前に、グローバルアトムテーブルは、停止の存在はプログラムインスタンスを実行したことを示す、作成見(作成時に追加された)特定の原子Aが存在するか否かをチェック;ランが存在しないと特定の原子にグローバルアトムテーブルを追加し、あなたがプログラムを終了、またはリリースにシャットダウンされるときに、特定の原子まあのリリースを覚えています。C#が次のことを実現する: 
1. 述べWinAPIのの関数インタフェース

        [System.Runtime.InteropServices.DllImport( "KERNEL32.DLL")]

        パブリック静的にexternするUInt32 GlobalAddAtom(文字列lpString); //追加原子

        [System.Runtime.InteropServices.DllImport( "KERNEL32.DLL")]

        パブリック静的にexternするUInt32 GlobalFindAtom(文字列lpString); //原子を探します

        [System.Runtime.InteropServices.DllImport( "KERNEL32.DLL")]

        パブリック静的にexternするUInt32 GlobalDeleteAtom(UInt32型nAtom); //削除の原子

 

 2. 修正メイン()関数は次のように次のとおりです。

静的な無効メイン()

        {

            もし(GlobalFindAtom(==) "jiaao_test" 77856768)//見つからない原子 "jiaao_test"

            {

                GlobalAddAtom( "jiaao_test"); //追加原子 "jiaao_test"

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(偽);

                Application.Run(新しいForm1の());

            }

            そうしないと

            {

                ます。MessageBox.Show(「のインスタンスを実行してきました。」);

            }

        }

 

3. FormClosedは、次のコードにイベントを追加: 
       GlobalDeleteAtom(GlobalFindAtom( "jiaao_test")); //削除原子"jiaao_test"

 

 

方法4:プロセスまでは、アクティブにするかどうかを判断します。

    静的クラスプログラム

    {

       /// <要約>

       ///アプリケーションのメインエントリポイント。

       /// </要約>

       [STAThread]

       静的な無効メイン()

       {

 

            //現在のプロセスIDを取得します。

            INT PID = Process.GetCurrentProcess()同上。

            BOOL isRun =偽;

            foreachの(Process.GetProcessesByName( "れるCallmaster")におけるプロセスP)

            {

                //現在のプログラムのプロセスを取得し、比較

                もし(Common.GetPath()。TOLOWER()== p.MainModule.FileName.ToLower())

                {

                    もし(PID!= p.Id)

                    {

                        isRun =はtrue。

                        ブレーク;

                    }

                }

            }

            もし(isRun ==真)

            {

                Application.Exit();

                リターン;

            }

 

 

           Application.EnableVisualStyles();

           Application.SetCompatibleTextRenderingDefault(偽);

           Application.Run(新しいfrmMain());

       }

 

    }

アプリケーションに現在のフルパスを取得するための放射線の使用:

          公共の静的な文字列GETPATH()

        {

            。System.Reflection.Assembly.GetExecutingAssembly()の場所を返します。

        }

 

方法5:相互に排他的なスレッドによって開始するかどうかを決定します。

   静的クラスプログラム

    {

        プライベート静的System.Threading.Mutexミューテックス。

 

        /// <要約>

        ///アプリケーションのメインエントリポイント。

        /// </要約>

        [STAThread]

        静的な無効メイン()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(偽);

 

            ミューテックス=新しいSystem.Threading.Mutex(真、 "OnlyRun");

            もし(mutex.WaitOne(0、偽))

            {

                Application.Run(新しいMainFormを());

            }

            そうしないと

            {

                MessageBox.Show( "プログラムが既に実行されている!"、 "ヒント"、MessageBoxButtons.OK、MessageBoxIcon.Information)。

                Application.Exit();

            }

        }

}

 

添付:プログラムが実行されているかどうかを判断する方法でC#のは?

(System.Diagnostics.Process.GetProcessesByName( "プログラムプロセスの名前で").ToList()。カウント> 0)であれば

{

  //が存在

}

 そうしないと

 {

  //存在しません。

 }

 

 

 

公開された17元の記事 ウォンの賞賛224 ビュー280 000 +

おすすめ

転載: blog.csdn.net/cxu123321/article/details/104694004