wince c#プログラムは1回しか実行できません

4440 ワード

最初の方法(これを使用することをお勧めします.私はすでにテストしました)のコードは以下の通りです.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
//using RFIDWareHouse.View;
using System.Runtime.InteropServices;

namespace Phone
{
    static class Program
    {
        [DllImport("coredll.Dll")]
        private static extern int GetLastError();
        [DllImport("coredll.Dll")]
        private static extern int ReleaseMutex(IntPtr hMutex);
        [DllImport("coredll.Dll")]
        private static extern IntPtr CreateMutex(SECURITY_ATTRIBUTES lpMutexAttributes, bool bInitialOwner, string lpName);

        private const int ERROR_ALREADY_EXISTS = 0183;
        [StructLayout(LayoutKind.Sequential)]
        public class SECURITY_ATTRIBUTES { public int nLength; public int lpSecurityDescriptor; public int bInheritHandle;    }

        /// <summary>
        ///  。
        /// </summary>
        [MTAThread]
        static void Main()
        {
           // Application.Run(new frMain());
            IntPtr hMutex = CreateMutex(null, false, "Futureproduct");
            if (GetLastError() != ERROR_ALREADY_EXISTS)
            {
                System.Windows.Forms.Application.Run(new frMain());
                return;
            }
            else
            {
                MessageBox.Show(" .");
                ReleaseMutex(hMutex);
                return;
            }
        }

    }
}

2つ目の方法:
public class Mutex
{
[DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
public static extern IntPtr CreateMutex(
IntPtr lpMutexAttributes,
bool InitialOwner,
string MutexName);

[DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
public static extern bool ReleaseMutex(IntPtr hMutex);

private const int ERROR_ALREADY_EXISTS = 0183;

/// <summary>
///  
/// </summary>
/// <returns>
/// true:  , 
/// false:  , 
/// </returns>
public static bool IsExist()
{
string strAppName = 
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
IntPtr hMutex = CreateMutex(IntPtr.Zero, true, strAppName);
if (hMutex == IntPtr.Zero)
throw new ApplicationException("Failure creating mutex: "
+ Marshal.GetLastWin32Error().ToString("X"));

if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS)
{
ReleaseMutex(hMutex);
return true;
}
return false;
}
}

 
3.

让专业组合起动一次--Mutex


プログラムを開発する際に、同時に1つのインスタンスしか実行できない場合がある.
Mutexクラスは、相互分割体と呼ばれ、共有リソースへの独占アクセス権を1つのスレッドにのみ付与する同期ベースです.
2つ以上のスレッドが共有リソースに同時にアクセスする必要がある場合、システムは同期メカニズムを使用して、一度に1つのスレッドだけがリソースを使用することを確保する必要があります.
1つのスレッドが反発体を取得した場合、その反発体を取得する2番目のスレッドは、最初のスレッドが反発体を解放するまで保留されます.
アプリケーションが唯一のインスタンスであることを保証するために、Mutexクラスを次に示します.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace  
{
    static class Program
    {
        /// <summary>
        ///  。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            bool bCreate;
            System.Threading.Mutex mutex = new System.Threading.Mutex(false, "SINGILE_INSTANCE_MUTEX", out bCreate);

            if (bCreate)
            {
                Application.Run(new Form1());
            }
            else
            {
                MessageBox.Show(" ");
                Application.Exit();
            }
        }
    }
}

 
由来:http://www.cnblogs.com/starxp/articles/1875090.html