Как убедиться, что запущен один экземпляр приложения - PullRequest
7 голосов
/ 24 декабря 2008

Я хочу проверить, когда пользователь дважды щелкает значок приложения, чтобы другой экземпляр этого приложения уже не работал.

Я читал о My.Application, но я все еще не знаю, что делать.

Ответы [ 11 ]

8 голосов
/ 24 декабря 2008

Это то, что я использовал ... (C # на .NET 2.0)

    [STAThread]
    private static void Main(string[] args)
    {
        //this follows best practices on
        //ensuring that this is a single instance app.
        string mutexName = "e50cf829-f6b9-471e-8d9f-67eac3699f09";
        bool grantedOwnership;
        //we prefix the mutexName with "Local\\" to allow this to run under terminal services.
        //The "Local\\" prefix forces this into local user space.
        //If we want to forbid this in TS, use the "Global\\" prefix.
        Mutex singleInstanceMutex = new Mutex(true, "Global\\" + mutexName, out grantedOwnership);
        try
        {
            if (!grantedOwnership)
            {
                MessageBox.Show("Error: X is already running.\n\nYou can only run one copy of X at a time.", "X", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                Application.Exit();
            }
            else
            {
                Application.Run(new X(args));
            }
        }
        finally
        {
            singleInstanceMutex.Close();
        }
    }
6 голосов
/ 24 декабря 2008

В VB .NET есть логическое свойство IsSingleInstance , которое выполняет эту работу за вас.

В VB (взято из здесь ):

Public Class Program
        Inherits Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase

       Public Sub New()
            Me.IsSingleInstance = True
        End Sub



End Class

Вот как вы используете его в C # (взято из здесь ):

// SingleInstanceApplication.cs
class SingleInstanceApplication : WindowsFormsApplicationBase {

 // Must call base constructor to ensure correct initial 
 // WindowsFormsApplicationBase configuration
 public SingleInstanceApplication() {

  // This ensures the underlying single-SDI framework is employed, 
  // and OnStartupNextInstance is fired
  this.IsSingleInstance = true;
 }
}


// Program.cs
static class Program {
 [STAThread]
 static void Main(string[] args) {
  Application.EnableVisualStyles();
  SingleInstanceApplication application = 
   new SingleInstanceApplication();
  application.Run(args);
 }
}

Обязательно используйте ссылку Microsoft.VisualBasic.dll в вашем проекте.

3 голосов
/ 24 декабря 2008

Откройте «Свойства проекта» (вкладка «Приложение») и установите флажок Создать одно приложение .

На вкладке Приложение также можно нажать кнопку Просмотр событий приложения , чтобы создать ApplicationEvents.vb класс, в котором вы можете обрабатывать второе событие экземпляра:

Partial Friend Class MyApplication
    Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
        ' Bring First Instance to Foreground
        e.BringToForeground = True
        ' Pass Second Instance Command Line to First Instance
        AppShared.DoSomethingWithCommandLine(e.CommandLine)
    End Sub
End Class
2 голосов
/ 24 августа 2015

С помощью советов, приведенных выше, я узнал, как сделать свое приложение единым экземпляром, но мне все равно пришлось перейти на другой сайт, чтобы узнать, КАК именно. Вот простая картина, как мне удалось это сделать. Это было легко, и я надеюсь, что это поможет другим с такой же потребностью, потому что я уверен, что ОП решил эту проблему 7 лет назад: enter image description here

2 голосов
/ 24 декабря 2008

В VB.NET приложение для одного экземпляра является просто флажком на странице свойств проекта . Вы также можете перехватить событие My.Application.StartupNextInstance , чтобы ваш отдельный экземпляр что-то сделал при запуске другой копии. Это может использоваться, например, для MDI-подобного поведения открытия запрошенного документа в исходном экземпляре.

За кулисами это инкапсулирует немало мьютекса и IPC goo - см. WindowsFormApplicationBase - и также может использоваться из C #.

2 голосов
/ 24 декабря 2008

Скотт Хансельман имеет хорошую статью об этом. Код написан на C #, но я думаю, его будет легко перенести на VB.

http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx

Вот еще одна статья на эту тему на случай, если она не будет соответствовать вашим потребностям:

http://www.codeproject.com/KB/cs/cssingprocess.aspx

1 голос
/ 24 декабря 2008

Если ваше приложение находится в VB.NET 2.0-3.5, самый простой способ сохранить один экземпляр программы - использовать «Свойства Windows Application Framework». Чтобы попасть туда, щелкните правой кнопкой мыши по названию вашего проекта и перейдите в «Свойства». Оказавшись там, установите флажок «Сделать один экземпляр приложения».

Вы также можете использовать ApplicationEvents.vb, чтобы показать пользователю, что он запустил вашу программу во второй раз. Вы можете легко создать / просмотреть это в том же окне свойств, нажав кнопку «Просмотр событий приложения». Там вы можете выбрать подпрограмму MyApplication_StartupNextInstance и ввести там код, например:

Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    MessageBox.Show("This program is already running.  If you do not see the program running, please check your " _
        & "Windows Task Manager for this program name in the 'Processes' Tab." & vbNewLine & vbNewLine & "WARNING: " _
        & " If you terminate the process, you will terminate the only instance of this program!", My.Application.Info.ProductName.ToString _
        & " is Running!", MessageBoxButtons.OK, MessageBoxIcon.Warning)

End Sub

Дайте мне знать, если это поможет! JFV

1 голос
/ 24 декабря 2008

Используйте Mutex. Фактически, Mutex может быть назван в виде строки и является уникальным для CLR.

Пример кода:

try
{
mutex = Mutex.OpenExisting(mutexName);
//since it hasn’t thrown an exception, then we already have one copy of the app open.
MessageBox.Show(”A copy of Todo 3.0 is already open. Please check your system tray (notification area).”,
“Todo 3.0″, MessageBoxButtons.OK, MessageBoxIcon.Information);
Environment.Exit(0);
}
catch (Exception Ex)
{
//since we didn’t find a mutex with that name, create one
Debug.WriteLine(”Exception thrown:” + Ex.Message + ” Creating a new mutex…”);
mutex = new Mutex(true, mutexName);
}

Из этой записи :

0 голосов
/ 24 декабря 2008

Я думал, что будет проще иметь образец здесь вместо ссылки.

    [STAThread]
    static void Main()
    {
        if (!IsAppAlreadyRunning())
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1()); /* Change Form1 for your main Form */
        }
        else
        {
            MessageBox.Show("Application is already running!");
        }
    }

    public static bool IsAppAlreadyRunning()
    {
        Process currentProcess = Process.GetCurrentProcess();
        return (IsAppAlreadyRunning(currentProcess.Id, 
                                    currentProcess.ProcessName));
    }

    private static bool IsAppAlreadyRunning(int ID, string Name)
    {
        bool isAlreadyRunning = false;
        Process[] processes = Process.GetProcesses();
        foreach (Process process in processes)
        {
            if (ID != process.Id)
            {
                if (Name == process.ProcessName)
                {
                    isAlreadyRunning = true;
                    break;
                }
            }
        }
        return isAlreadyRunning;
    }
0 голосов
/ 24 декабря 2008

Присвойте своему приложению некоторый уникальный идентификатор, такой как жестко заданный guid, и создайте экземпляр Mutex, где вы назначите мьютекс именно этому идентификатору. Если он выдает исключение, тогда if означает, что ваше приложение уже запущено (поскольку ему удалось создать мьютекс)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...