C#只允许启动一个WinFrom进程的两种方法

黄舟
Release: 2016-12-21 14:43:44
Original
1743 people have browsed it

方法一:只禁止多个进程运行

view plaincopy to clipboardPRint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
[STAThread]   
public static void Main()   
{   
    bool ret;   
    System.Threading.Mutex mutex = new System.Threading.Mutex(true, application.ProductName, out ret);   
    if (ret)   
    {   
        System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格      
        System.Windows.Forms.Application.DoEvents();   
        System.Windows.Forms.Application.Run(new Main());   
        //   Main   为你程序的主窗体,如果是控制台程序不用这句      
        mutex.ReleaseMutex();   
    }   
    else  
    {   
        MessageBox.Show(null, "有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);   
        //   提示信息,可以删除。      
        Application.Exit();//退出程序      
    }   
}  
[STAThread]
public static void Main()
{
    bool ret;
    System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);
    if (ret)
    {
        System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   
        System.Windows.Forms.Application.DoEvents();
        System.Windows.Forms.Application.Run(new Main());
        //   Main   为你程序的主窗体,如果是控制台程序不用这句   
        mutex.ReleaseMutex();
    }
    else
    {
        MessageBox.Show(null, "有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        //   提示信息,可以删除。   
        Application.Exit();//退出程序   
    }
}


方法二:禁止多个进程运行,并当重复运行时激活以前的进程 

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
[STAThread]   
public static void Main()   
{   
    //Get   the   running   instance.      
    Process instance = RunningInstance();   
    if (instance == null)   
    {   
        System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格      
        System.Windows.Forms.Application.DoEvents();   
        //There   isn't   another   instance,   show   our   form.      
        Application.Run(new Main());   
    }   
    else  
    {   
        //There   is   another   instance   of   this   process.      
        HandleRunningInstance(instance);   
    }   
}   
public static Process RunningInstance()   
{   
    Process current = Process.GetCurrentProcess();   
    Process[] processes = Process.GetProcessesByName(current.ProcessName);   
    //Loop   through   the   running   processes   in   with   the   same   name      
    foreach (Process process in processes)   
    {   
        //Ignore   the   current   process      
        if (process.Id != current.Id)   
        {   
            //Make   sure   that   the   process   is   running   from   the   exe   file.      
            if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)   
            {   
                //Return   the   other   process   instance.      
                return process;   
            }   
        }   
    }   
    //No   other   instance   was   found,   return   null.    
    return null;   
}   
public static void HandleRunningInstance(Process instance)   
{   
    //Make   sure   the   window   is   not   minimized   or   maximized      
    ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);   
    //Set   the   real   intance   to   foreground   window   
    SetForegroundWindow(instance.MainWindowHandle);   
}   
[DllImport("User32.dll")]   
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);   
[DllImport("User32.dll")]   
private static extern bool SetForegroundWindow(IntPtr hWnd);   
private const int WS_SHOWNORMAL = 1;  
[STAThread]
public static void Main()
{
    //Get   the   running   instance.   
    Process instance = RunningInstance();
    if (instance == null)
    {
        System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格   
        System.Windows.Forms.Application.DoEvents();
        //There   isn't   another   instance,   show   our   form.   
        Application.Run(new Main());
    }
    else
    {
        //There   is   another   instance   of   this   process.   
        HandleRunningInstance(instance);
    }
}
public static Process RunningInstance()
{
    Process current = Process.GetCurrentProcess();
    Process[] processes = Process.GetProcessesByName(current.ProcessName);
    //Loop   through   the   running   processes   in   with   the   same   name   
    foreach (Process process in processes)
    {
        //Ignore   the   current   process   
        if (process.Id != current.Id)
        {
            //Make   sure   that   the   process   is   running   from   the   exe   file.   
            if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
            {
                //Return   the   other   process   instance.   
                return process;
            }
        }
    }
    //No   other   instance   was   found,   return   null. 
    return null;
}
public static void HandleRunningInstance(Process instance)
{
    //Make   sure   the   window   is   not   minimized   or   maximized   
    ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
    //Set   the   real   intance   to   foreground   window
    SetForegroundWindow(instance.MainWindowHandle);
}
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1; 

 以上就是C#只允许启动一个WinFrom进程的两种方法的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact [email protected]
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!