最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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.fzitv.net/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)文章

  • 詳解Unity中的ShaderGraph入門使用教程

    詳解Unity中的ShaderGraph入門使用教程

    Unity2018版本之后推出了一個可編程渲染管線工具ShaderGraph,讓我們可以通過可視化界面拖拽來實現(xiàn)著色器的創(chuàng)建和編輯,今天重點給大家介紹Unity中的ShaderGraph入門使用教程,需要的朋友參考下吧
    2021-07-07
  • C# 調(diào)用命令行執(zhí)行Cmd命令的操作

    C# 調(diào)用命令行執(zhí)行Cmd命令的操作

    這篇文章主要介紹了C# 調(diào)用命令行執(zhí)行Cmd命令的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#網(wǎng)頁跳轉(zhuǎn)方法總結(jié)

    C#網(wǎng)頁跳轉(zhuǎn)方法總結(jié)

    這篇文章主要介紹了C#網(wǎng)頁跳轉(zhuǎn)方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • WPF/Silverlight實現(xiàn)圖片局部放大的方法分析

    WPF/Silverlight實現(xiàn)圖片局部放大的方法分析

    這篇文章主要介紹了WPF/Silverlight實現(xiàn)圖片局部放大的方法,結(jié)合實例形式分析了WPF/Silverlight針對圖片屬性操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • C# WebApi+Webrtc局域網(wǎng)音視頻通話實例

    C# WebApi+Webrtc局域網(wǎng)音視頻通話實例

    這篇文章主要為大家詳細介紹了C# WebApi+Webrtc局域網(wǎng)音視頻通話實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 輕松學(xué)習(xí)C#的結(jié)構(gòu)和類

    輕松學(xué)習(xí)C#的結(jié)構(gòu)和類

    輕松學(xué)習(xí)C#的結(jié)構(gòu)和類,對C#的結(jié)構(gòu)和類感興趣的朋友可以參考本篇文章,幫助大家更靈活的運用C#的結(jié)構(gòu)和類
    2015-11-11
  • 在C#中使用MongoDB數(shù)據(jù)庫

    在C#中使用MongoDB數(shù)據(jù)庫

    這篇文章介紹了在C#中使用MongoDB數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c#棧變化規(guī)則圖解示例(棧的生長與消亡)

    c#棧變化規(guī)則圖解示例(棧的生長與消亡)

    多數(shù)情況下我們不需要關(guān)心棧的變化,下文會給出一個具體的示例。另外,理解棧的變化對于理解作用域也有一定的好處,因為C#的局部變量作用域是基于棧的。
    2013-11-11
  • C#讀寫txt文件的2種方法

    C#讀寫txt文件的2種方法

    這篇文章主要為大家詳細介紹了C#讀寫txt文本文檔數(shù)據(jù)的2種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C#四種計時器Timer的區(qū)別和用法

    C#四種計時器Timer的區(qū)別和用法

    這篇文章介紹了C#四種計時器Timer的區(qū)別和用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

姜堰市| 溆浦县| 天水市| 灵寿县| 中方县| 兴文县| 房产| 乐都县| 博乐市| 于田县| 团风县| 山东| 宜章县| 惠东县| 兴仁县| 崇左市| 上思县| 鹤壁市| 莱阳市| 仙居县| 当阳市| 抚远县| 西青区| 横山县| 云阳县| 云安县| 景泰县| 个旧市| 赤壁市| 南京市| 瓮安县| 政和县| 丰原市| 油尖旺区| 肇东市| 楚雄市| 盘锦市| 凤翔县| 沅陵县| 湟源县| 肃宁县|