Visual Basic, .NET, ASP, VBScript
 
   
   
     
   
 


Как сделать, чтобы в данный момент работала только одна копия программы?



using System;
using System.Threading;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class MyApplication: Form
{
    public static void Main()
    {
        if (CheckOneInstance.IsInstanceExist(true))
            return;
        Application.Run(new MyApplication());
    }

    sealed class CheckOneInstance
    {
        static Mutex mutex;
         
        //Создавать экземпляры этого класса нет смысла
        CheckOneInstance()
        {
        }

        public static bool IsInstanceExist(bool activateFirstInstance)
        {
            bool createdNew;
            mutex = new Mutex(false, "My Mutex Name", out createdNew);
            if (!createdNew)
            {
                if (!activateFirstInstance)
                    return true;
                //получаем имя нашего процесса (название файла без
расширения '.exe')
                string processName =
Process.GetCurrentProcess().MainModule.ModuleName;
                processName = processName.Substring(0,
processName.IndexOf(".exe"));

                Process currentProcess = Process.GetCurrentProcess();

                //перебираем все процессы с искомым именем
                foreach(Process process in
Process.GetProcessesByName(processName))
                {
                    //текущий экземпляр нас не интересует
                    if (process.Id == currentProcess.Id)
                        continue;

                    //могут быть разные приложения с одинаковым именем
                    //исполняемого файла. Проверяем что-бы это был 'наш'
файл
                    if (process.MainModule.FileName !=
currentProcess.MainModule.FileName)
                        continue;

                    //Активизируем основное окно приложения
                    if (IsIconic(process.MainWindowHandle))
                        ShowWindow(process.MainWindowHandle,
SW_RESTORE);
                    else
                        SetForegroundWindow(process.MainWindowHandle);

                    break;
                }
                return true;
            }
            return false;
        }

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

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

        [DllImport("User32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
     
        const int SW_RESTORE = 9;
    }
}
 
     

   
   
     
  VBNet рекомендует  
   
     
   
   
     
   
   
     

© Copyright 2002-2011 VBNet.RU | Пишите нам