欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#防止多次運行代碼收集分享

 更新時間:2013年09月06日 16:13:53   投稿:shangke  
原文:經(jīng)過我的測試,還比較好用,但是有個問題,如果不注銷,用另一個用戶進入,則程序不能判斷出已運行。所以只限于用在單用戶環(huán)境,還是不太完美

方法一

class Program
  {
    [STAThread]
    static void Main(string[] args)
    {
      //防止程序多次運行
      if (!OneInstance.IsFirst("MyTest"))
      {
        Console.WriteLine("警告:程序正在運行中! 請不要重復(fù)打開程序!可在右下角系統(tǒng)欄找到!");
        return;
      }
      Console.WriteLine("正在運行中");
      Console.ReadLine();
    }
  }
  public static class OneInstance
  {
    ///<summary>
    ///判斷程序是否正在運行 
    ///</summary>
    ///<param name="appId">程序名稱</param>
    ///<returns>如果程序是第一次運行返回True,否則返回False</returns>
    public static bool IsFirst(string appId)
    {
      bool ret = false;
      if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
      {
        CreateMutex(IntPtr.Zero, 0, appId);
        ret = true;
      }
      return ret;
    }
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr OpenMutex(
      uint dwDesiredAccess, // access 
      int bInheritHandle,  // inheritance option 
      string lpName     // object name 
      );
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr CreateMutex(
      IntPtr lpMutexAttributes, // SD 
      int bInitialOwner,            // initial owner 
      string lpName              // object name 
      );
  }

方法二

string MnName = Process.GetCurrentProcess().MainModule.ModuleName;
 //返回不具有擴展名的制定路徑字符串的文件名
String Pname = Path.GetFileNameWithoutExtension(MnName);
Process[] myprocess = Process.GetProcessesByName(Pname);
if (myprocess.Length > 1)
{
  MessageBox.Show("yici", "tishi", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
  //Application.EnableVisualStyles();
  ////Application.SetCompatibleTextRenderingDefault(false);
  //Application.Run(new Form1());
}

方法三

原文如下(//www.dbjr.com.cn/article/41179.htm

經(jīng)常我們會有這樣的需求,只讓應(yīng)用程序運行一個實體。通常我們的情況是,雙擊一個exe文件,就運行一個程序的實體,再雙擊一次這個exe文件,又 運行這個應(yīng)用程序的另一個實體。就拿QQ游戲來說吧,一臺電腦上一般只能運行一個QQ游戲大廳。

那我們的程序也能像QQ游戲那里禁止多次啟動嗎,答案是可以的,下面介紹下一個簡單的實現(xiàn)方法,那就是Mutex(互斥)。

      Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多個線程同步訪問的一個類。它非常類似了Monitor類,因為他們都只有一個線程能擁有鎖定。而操作系統(tǒng)能夠識別有名稱的互 斥,我們可以給互斥一個唯一的名稱,在程序啟動之前加一個這樣的互斥。這樣每次程序啟動之前,都會檢查這個命名的互斥是否存在。如果存在,應(yīng)用程序就退 出。

static class Program
  {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
      bool createdNew;
      //系統(tǒng)能夠識別有名稱的互斥,因此可以使用它禁止應(yīng)用程序啟動兩次
      //第二個參數(shù)可以設(shè)置為產(chǎn)品的名稱:Application.ProductName

      //每次啟動應(yīng)用程序,都會驗證名稱為SingletonWinAppMutex的互斥是否存在
      Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);
      
      //如果已運行,則在前端顯示
      //createdNew == false,說明程序已運行
      if (!createdNew)
      {
        Process instance = GetExistProcess();
        if (instance != null)
        {
          SetForegroud(instance);
          Application.Exit();
          return;
        }
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new MainForm());
    }

    /// <summary>
    /// 查看程序是否已經(jīng)運行
    /// </summary>
    /// <returns></returns>
    private static Process GetExistProcess()
    {
      Process currentProcess = Process.GetCurrentProcess();
      foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
      {
        if ((process.Id != currentProcess.Id) && 
          (Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))
        {
          return process;
        }
      }
      return null;
    }

    /// <summary>
    /// 使程序前端顯示
    /// </summary>
    /// <param name="instance"></param>
    private static void SetForegroud(Process instance)
    {
      IntPtr mainFormHandle = instance.MainWindowHandle;
      if (mainFormHandle != IntPtr.Zero)
      {
        ShowWindowAsync(mainFormHandle, 1);
        SetForegroundWindow(mainFormHandle);
      }
    }

    [DllImport("User32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("User32.dll")]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  }

經(jīng)過我的測試,還比較好用,但是有個問題,如果不注銷,用另一個用戶進入,則程序不能判斷出已運行。所以只限于用在單用戶環(huán)境,還是不太完美。

class Program
  {
    [STAThread]
    static void Main(string[] args)
    {
      //防止程序多次運行
      if (!OneInstance.IsFirst("MyTest"))
      {
        Console.WriteLine("警告:程序正在運行中! 請不要重復(fù)打開程序!可在右下角系統(tǒng)欄找到!");
        return;
      }
      Console.WriteLine("正在運行中");
      Console.ReadLine();
    }
  }
  public static class OneInstance
  {
    ///<summary>
    ///判斷程序是否正在運行 
    ///</summary>
    ///<param name="appId">程序名稱</param>
    ///<returns>如果程序是第一次運行返回True,否則返回False</returns>
    public static bool IsFirst(string appId)
    {
      bool ret = false;
      if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
      {
        CreateMutex(IntPtr.Zero, 0, appId);
        ret = true;
      }
      return ret;
    }
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr OpenMutex(
      uint dwDesiredAccess, // access 
      int bInheritHandle,  // inheritance option 
      string lpName     // object name 
      );
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr CreateMutex(
      IntPtr lpMutexAttributes, // SD 
      int bInitialOwner,            // initial owner 
      string lpName              // object name 
      );
  }

相關(guān)文章

  • C#做線形圖的方法

    C#做線形圖的方法

    在本篇內(nèi)容中小編給大家總結(jié)了C#怎么做線形圖的教程內(nèi)容,對此有需要的朋友們可以跟著學(xué)習(xí)下。
    2018-12-12
  • C#實現(xiàn)訪問Web API Url提交數(shù)據(jù)并獲取處理結(jié)果

    C#實現(xiàn)訪問Web API Url提交數(shù)據(jù)并獲取處理結(jié)果

    Web API  是 Web 服務(wù)器和 Web 瀏覽器之間的應(yīng)用程序處理接口,我們常見的模式是訪問 Web API Url 地址,并獲取 Json 、XML或其它指定格式的處理結(jié)果, 本文我們介紹了使用C#實現(xiàn)訪問Web API Url提交數(shù)據(jù)并獲取處理結(jié)果,需要的朋友可以參考下
    2024-05-05
  • c#匹配整數(shù)和小數(shù)的正則表達式

    c#匹配整數(shù)和小數(shù)的正則表達式

    c#中使用正則表達式需要加入using System.Text.RegularExpressions的引用
    2010-12-12
  • C#的循環(huán)語句集錦及案例詳解

    C#的循環(huán)語句集錦及案例詳解

    這篇文章主要介紹了C#中的基本循環(huán):while循環(huán)、for循環(huán)和foreach循環(huán),大家都知道循環(huán)結(jié)構(gòu)可以簡化程序編碼,更好地實現(xiàn)理想的效果,并結(jié)合案例給大家講解,需要的朋友可以參考下
    2015-07-07
  • C#實現(xiàn)異步GET的方法

    C#實現(xiàn)異步GET的方法

    這篇文章主要介紹了C#實現(xiàn)異步GET的方法,涉及C#異步請求的相關(guān)實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#多線程系列之線程池

    C#多線程系列之線程池

    本文詳細講解了C#多線程中的線程池,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#中DataTable和List互轉(zhuǎn)的示例代碼

    C#中DataTable和List互轉(zhuǎn)的示例代碼

    很多場景下,我們需要將List轉(zhuǎn)換成為DataTable,本文主要介紹了C#中DataTable和List互轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 如何在datagridview中添加button按鈕

    如何在datagridview中添加button按鈕

    這篇文章主要介紹了如何在datagridview中添加button按鈕問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn)

    unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn)

    這篇文章主要為大家詳細介紹了unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • c#實現(xiàn)適配器模式的項目實踐

    c#實現(xiàn)適配器模式的項目實踐

    適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另一個接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作,本文主要介紹了c#實現(xiàn)適配器模式的項目實踐,感興趣的可以一起來了解一下
    2023-08-08

最新評論