欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當前位置:主頁 > 軟件編程 > C#教程 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊: 次

本文實例講述了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>
    /// 該函數(shù)設置由不同線程產(chǎn)生的窗口的顯示狀態(tài)。
    /// </summary>
    /// <param name="hWnd">窗口句柄</param>
    /// <param name="cmdShow">指定窗口如何顯示。查看允許值列表,請查閱ShowWlndow函數(shù)的說明部分。</param>
    /// <returns>如果函數(shù)原來可見,返回值為非零;如果函數(shù)原來被隱藏,返回值為零。</returns>
    [DllImport("User32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
    /// <summary>
    /// 該函數(shù)將創(chuàng)建指定窗口的線程設置到前臺,并且激活該窗口。鍵盤輸入轉向該窗口,并為用戶改各種可視的記號。系統(tǒng)給創(chuàng)建前臺窗口的線程分配的權限稍高于其他線程。
    /// </summary>
    /// <param name="hWnd">將被激活并被調(diào)入前臺的窗口句柄。</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>
    /// 該函數(shù)設置由不同線程產(chǎn)生的窗口的顯示狀態(tài)。
    /// </summary>
    /// <param name="hWnd">窗口句柄</param>
    /// <param name="cmdShow">指定窗口如何顯示。查看允許值列表,請查閱ShowWlndow函數(shù)的說明部分。</param>
    /// <returns>如果函數(shù)原來可見,返回值為非零;如果函數(shù)原來被隱藏,返回值為零。</returns>
    [DllImport("User32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
    /// <summary>
    /// 該函數(shù)將創(chuàng)建指定窗口的線程設置到前臺,并且激活該窗口。鍵盤輸入轉向該窗口,并為用戶改各種可視的記號。系統(tǒng)給創(chuàng)建前臺窗口的線程分配的權限稍高于其他線程。
    /// </summary>
    /// <param name="hWnd">將被激活并被調(diào)入前臺的窗口句柄。</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#相關內(nèi)容感興趣的讀者可查看本站專題:《WinForm控件用法總結》、《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結》

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

上一篇:C# for循環(huán)的經(jīng)典案例集錦

欄    目:C#教程

下一篇:淺談C#中的for循環(huán)與foreach循環(huán)

本文標題:WinForm防止程序重復運行的方法分析

本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5706.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權所有