Make application close when .exe is executed again

I'm currently working on a simple converter tool and was wondering if it's possible to make the application close if I run the .exe again. Some kind of "if two instances run -> close both".

I need this function because I run the application via a shortcut-button inside a third party program. So I would like if my converter app closes once I press this shortcut-button again.

I know it sounds counter intuitive running the exe again to close, but i have to have my app work the same way as the integrated tools in the third party program, and this involves opening and closing tools by pressing their respective toggle-buttons. I can't add a plug-in running inside the third party program, but i CAN add a shortcut button next to the integrated tools. It's a work around, but it will at least act like a toggle button.

Upvotes: 1

Views: 945

Answers (2)

Logman
Logman

Reputation: 4189

You could do something like this:

Process currentProcess = Process.GetCurrentProcess();
bool suocide = false;
foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
{
    if (process.MainModule.FileName == currentProcess.MainModule.FileName && process.Id != currentProcess.Id)
    {
        process.CloseMainWindow();
        process.Close();
        //process.Kill(); or you can do kill instead
        suocide = true;
    }
}

if (suocide)
    currentProcess.Kill(); // you probably don't care about new process as it is just for closing purpose but if you do then do a proper application exit

You can put it inside your window constructor.

Upvotes: 1

FastAl
FastAl

Reputation: 6279

Step 1 Identify a 2nd instance:

I'd recommend the MUTEX answer in this question: How can I prevent launching my app multiple times?

Step 2 Get that first instance closed

Although the MUTEX answer identifies a second instance, it gives no way to find it and tell it to close.

Solution: Listen with a named pipe in the app (first instance the ClosEE):

//using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

public static class SomeClass
{

    public static void SomeMethod()
    {
        Threading.Thread t = new Threading.Thread(() =>
        {
            try {
                while (true) {
                    dynamic server = new NamedPipeServerStream("Closer", PipeDirection.InOut, -1);
                    server.WaitForConnection();
                    if (!server.IsConnected)
                        return;
                    dynamic reader = new IO.StreamReader(server);
                    dynamic casetxt = reader.ReadToEnd();
                    server.Close();
                    RootForm.Invoke(() =>
                    {
                        if (casetxt == "End") {
                            System.Environment.Exit(0);
                        }
                    });
                }
            } catch (Exception ex) {
                // try/catch required in all child threads as error silently ends app.
                // log it... 
            }
        });
        t.IsBackground = true;
        t.Name = "EnderListener";
        t.Start();
    }
}

//=======================================================
//Service provided by Telerik (www.telerik.com)

Then when you detect a second instance via the Mutex, send this message from the 2nd instance the "Closer":

    dynamic serverloopcount = 1;
    dynamic iteration = 1;
    dynamic GotServerCount = false;
    do {
        NamedPipeClientStream client = new NamedPipeClientStream("Closer");
        client.Connect();
        if (!GotServerCount) {
            GotServerCount = true;
            serverloopcount = client.NumberOfServerInstances;
        }
        dynamic reader = new IO.StreamReader(client);
        dynamic writer = new IO.StreamWriter(client);
        writer.WriteLine("End");
        writer.Flush();
        writer.Close();
        client.Close();
        iteration += 1;
    } while (iteration <= serverloopcount);

Good luck.

Upvotes: 1

Related Questions