亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WinForm防止程序重復運行的方法分析

2019-10-29 21:10:15
字體:
來源:轉載
供稿:網友

本文實例講述了WinForm防止程序重復運行的方法。分享給大家供大家參考,具體如下:

需求:

1、點擊“關閉”按鈕時,程序最小化到托盤,并沒有退出,這時再次運行程序,不會重復運行,而是顯示已運行的程序;
2、支持不同目錄;
3、支持修改名稱。

代碼(不支持修改名稱,不支持不同目錄):

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Windows.Forms;using Tool;using System.Diagnostics;using System.Reflection;using System.Runtime.InteropServices;namespace 計算器{  static class Program  {    [DllImport("user32.dll")]    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);    /// <summary>    /// 該函數設置由不同線程產生的窗口的顯示狀態。    /// </summary>    /// <param name="hWnd">窗口句柄</param>    /// <param name="cmdShow">指定窗口如何顯示。查看允許值列表,請查閱ShowWlndow函數的說明部分。</param>    /// <returns>如果函數原來可見,返回值為非零;如果函數原來被隱藏,返回值為零。</returns>    [DllImport("User32.dll")]    private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);    /// <summary>    /// 該函數將創建指定窗口的線程設置到前臺,并且激活該窗口。鍵盤輸入轉向該窗口,并為用戶改各種可視的記號。系統給創建前臺窗口的線程分配的權限稍高于其他線程。    /// </summary>    /// <param name="hWnd">將被激活并被調入前臺的窗口句柄。</param>    /// <returns>如果窗口設入了前臺,返回值為非零;如果窗口未被設入前臺,返回值為零。</returns>    [DllImport("User32.dll")]    private static extern bool SetForegroundWindow(IntPtr hWnd);    private const int SW_SHOWNORMAL = 1;    /// <summary>    /// 應用程序的主入口點。    /// </summary>    [STAThread]    static void Main()    {      Application.EnableVisualStyles();      Application.SetCompatibleTextRenderingDefault(false);      Process processes = RunningInstance();      if (processes == null)      {        Application.Run(new Form1());      }      else      {        HandleRunningInstance(processes);      }    }    /// <summary>    /// 獲取正在運行的實例,沒有運行的實例返回null;    /// </summary>    public static Process RunningInstance()    {      Process current = Process.GetCurrentProcess();      Process[] processes = Process.GetProcessesByName(current.ProcessName);      foreach (Process process in processes)      {        if (process.Id != current.Id)        {          if (Assembly.GetExecutingAssembly().Location.Replace("/", "//") == current.MainModule.FileName)          {            return process;          }        }      }      return null;    }    /// <summary>    /// 顯示已運行的程序。    /// </summary>    public static void HandleRunningInstance(Process instance)    {      try      {        IntPtr formHwnd = FindWindow(null, "計算器");        ShowWindow(formHwnd, SW_SHOWNORMAL);  //顯示        SetForegroundWindow(formHwnd);     //放到前端      }      catch (Exception ex)      {        MessageBox.Show(ex.Message);      }    }  }}

代碼(支持修改名稱,支持不同目錄):

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Windows.Forms;using Tool;using System.Diagnostics;using System.Reflection;using System.Runtime.InteropServices;namespace 計算器{  static class Program  {    [DllImport("user32.dll")]    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);    /// <summary>    /// 該函數設置由不同線程產生的窗口的顯示狀態。    /// </summary>    /// <param name="hWnd">窗口句柄</param>    /// <param name="cmdShow">指定窗口如何顯示。查看允許值列表,請查閱ShowWlndow函數的說明部分。</param>    /// <returns>如果函數原來可見,返回值為非零;如果函數原來被隱藏,返回值為零。</returns>    [DllImport("User32.dll")]    private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);    /// <summary>    /// 該函數將創建指定窗口的線程設置到前臺,并且激活該窗口。鍵盤輸入轉向該窗口,并為用戶改各種可視的記號。系統給創建前臺窗口的線程分配的權限稍高于其他線程。    /// </summary>    /// <param name="hWnd">將被激活并被調入前臺的窗口句柄。</param>    /// <returns>如果窗口設入了前臺,返回值為非零;如果窗口未被設入前臺,返回值為零。</returns>    [DllImport("User32.dll")]    private static extern bool SetForegroundWindow(IntPtr hWnd);    private const int SW_SHOWNORMAL = 1;    /// <summary>    /// 應用程序的主入口點。    /// </summary>    [STAThread]    static void Main()    {      Common.AutoRegister();      Application.EnableVisualStyles();      Application.SetCompatibleTextRenderingDefault(false);      bool createNew;      using (System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out createNew))      {        if (createNew)        {          FileOperator.SetValue("ProcessId", Process.GetCurrentProcess().Id.ToString()); //進程ID寫入文件          Application.Run(new Form1());        }        else        {          try          {            string strProcessId = FileOperator.GetValue("ProcessId"); //從文件中獲取進程ID            int processId = Convert.ToInt32(strProcessId);            Process process = Process.GetProcessById(processId);            HandleRunningInstance(process);          }          catch          {            FileOperator.SetValue("ProcessId", Process.GetCurrentProcess().Id.ToString()); //進程ID寫入文件            Application.Run(new Form1());          }        }      }    }    /// <summary>    /// 顯示已運行的程序。    /// </summary>    public static void HandleRunningInstance(Process instance)    {      try      {        IntPtr formHwnd = FindWindow(null, "計算器");        ShowWindow(formHwnd, SW_SHOWNORMAL);  //顯示        SetForegroundWindow(formHwnd);     //放到前端      }      catch (Exception ex)      {        MessageBox.Show(ex.Message);      }    }  }}

其實,IntPtr formHwnd = FindWindow(null, "計算器"); 這段代碼是有BUG的,比如你打開一個名為“計算器”的文件夾,那么FindWindow找到的其實是這個文件夾,而不是計算器程序。我們可以在主窗體第一次顯示的時候,記下窗口句柄,代碼如下:

private void Form1_Shown(object sender, EventArgs e){  FileOperator.SetValue("hwnd", Process.GetCurrentProcess().MainWindowHandle.ToString());}

然后,顯示已運行的程序時,從文件中讀取之前記錄的窗口句柄,代碼如下:

/// <summary>/// 顯示已運行的程序/// </summary>public static void HandleRunningInstance(Process instance){  try  {    IntPtr hwnd = new IntPtr(Convert.ToInt32(FileOperator.GetValue("hwnd")));    ShowWindow(hwnd, SW_SHOWNORMAL); //顯示    SetForegroundWindow(hwnd); //放到前端  }  catch (Exception ex)  {    MessageBox.Show(ex.Message);  }}

綜上,再整理一下,就能得到完美的解決方案。

希望本文所述對大家C#程序設計有所幫助。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人a**站| 国产亚洲精品久久久久久牛牛| 亚洲女同精品视频| 国产精品大片wwwwww| 久久中文久久字幕| 欧美在线一区二区视频| 国产精品日韩av| 国产亚洲欧美日韩美女| 人人做人人澡人人爽欧美| 操人视频在线观看欧美| 精品无码久久久久久国产| 国产精品羞羞答答| 亚洲午夜未满十八勿入免费观看全集| 久久久精品一区二区三区| 欧美成人精品在线视频| 欧美极品美女视频网站在线观看免费| 欧美激情国内偷拍| 久久久精品免费视频| 国产视频久久久久久久| 亚洲成人网久久久| 亚洲一区二区在线| 96pao国产成视频永久免费| 久久91亚洲人成电影网站| 欧美视频在线免费| 欧美高跟鞋交xxxxxhd| 色偷偷偷亚洲综合网另类| 久久久亚洲网站| 成人动漫网站在线观看| 亚洲一区制服诱惑| 亚洲第一二三四五区| 高清欧美性猛交xxxx黑人猛交| 欧美贵妇videos办公室| www.日韩视频| 欧美激情xxxxx| 欧美日韩午夜视频在线观看| 中文字幕国产精品久久| 91在线高清视频| 精品久久久久久中文字幕大豆网| 国产精品精品一区二区三区午夜版| 欧美乱人伦中文字幕在线| 精品久久久在线观看| 欧美成人免费大片| 国产成人av在线播放| 亚洲人成亚洲人成在线观看| 日韩精品在线视频| 欧美超级免费视 在线| 国产精品免费视频xxxx| 91精品国产综合久久香蕉| 欧美亚洲另类在线| 国产成人精品av| 国产精品女主播视频| 日韩精品极品毛片系列视频| 国产一区二区三区18| 欧美性极品xxxx做受| 欧美香蕉大胸在线视频观看| 国产精品中文字幕久久久| 中文日韩在线观看| www日韩中文字幕在线看| 日韩精品免费视频| 国产日韩中文在线| 日韩中文字幕在线播放| 欧美亚洲成人网| 亚洲美腿欧美激情另类| 日韩av电影免费观看高清| 在线播放日韩专区| 久久91亚洲精品中文字幕| 日韩在线视频网| 亚洲乱亚洲乱妇无码| 日韩中文视频免费在线观看| 亚洲第一精品久久忘忧草社区| www.99久久热国产日韩欧美.com| 久久99精品视频一区97| 亚洲国产女人aaa毛片在线| 茄子视频成人在线| 91精品在线一区| 欧美精品电影在线| 麻豆精品精华液| 国产欧美精品va在线观看| 亚洲国产精品女人久久久| 色综合色综合久久综合频道88| 欧美激情一二三| 精品国产1区2区| 91精品在线影院| 欧美日韩免费观看中文| 中文字幕精品久久| 欧美大片在线看免费观看| www.欧美免费| 97在线视频免费播放| 国产欧美日韩最新| 欧美午夜精品在线| 精品欧美国产一区二区三区| 在线成人激情视频| 欧美激情性做爰免费视频| 亚洲最大的av网站| 国模叶桐国产精品一区| 久久男人的天堂| 国产精品视频不卡| 亚洲国产精品久久久久秋霞不卡| 亚洲无限av看| 久久久精品久久久久| 久久久欧美精品| 欧美自拍视频在线观看| 亚洲电影免费观看高清完整版在线观看| 欧美激情videos| 亚洲国产婷婷香蕉久久久久久| 日韩精品视频观看| 亚洲福利视频二区| 日韩视频免费看| 欧美大胆a视频| 国产91av在线| 成人乱人伦精品视频在线观看| 亚洲第一天堂无码专区| 日韩中文字幕国产精品| 国产成人综合精品在线| 日韩免费看的电影电视剧大全| 欧美成人性色生活仑片| 久久影视三级福利片| 久久在线观看视频| 国产男女猛烈无遮挡91| 欧美专区在线视频| 亚洲日本成人女熟在线观看| 久久久国产精品亚洲一区| 午夜精品久久久久久久99黑人| 992tv成人免费影院| 日韩精品免费一线在线观看| 国产精品女主播视频| 欧美高清视频在线观看| 亚洲福利视频久久| 亚洲视频精品在线| 清纯唯美亚洲综合| 欧美xxxx做受欧美.88| 久久久国产91| 伊人久久精品视频| 日韩精品免费综合视频在线播放| 国产精品日本精品| 国产精品吊钟奶在线| 91久久国产综合久久91精品网站| 九九热最新视频//这里只有精品| 日韩一级黄色av| 精品欧美国产一区二区三区| 欧美日韩国产成人在线观看| 亚洲国产91精品在线观看| 亚洲香蕉成人av网站在线观看| 欧美精品成人91久久久久久久| 国产精品成人aaaaa网站| 亚洲开心激情网| 91国内揄拍国内精品对白| 亚洲视频在线观看视频| 亚洲国产精品免费| 97精品伊人久久久大香线蕉| 国模吧一区二区| 欧美电影免费观看电视剧大全| 欧美日韩在线观看视频小说| 亚洲国产精品美女| 91av视频在线播放| 久久精品国产91精品亚洲| 深夜精品寂寞黄网站在线观看| 欧美高清理论片| 久久久久久久av| 国产精品久久久久久久久久久不卡| 亚洲精品电影久久久| 插插插亚洲综合网| 国产精品极品美女在线观看免费| 亚洲高清一区二|