Search code examples
c#.netprocess.net-assemblyhandle

Different process handles


I'm trying to check, when the program starts, if an instance is ever launch. If it is, I whould like to kill it.

I've this code:

        Process[] processes =
            Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location));

        while (processes.Length != 0)
        {
            bool killed = false;

            foreach (Process process in processes)
            {
                string fileName;

                try
                {
                    fileName = process.Modules[0].FileName;
                }
                catch (Win32Exception)
                {
                    continue;
                }

                if ((fileName == Assembly.GetExecutingAssembly().Location)
                    && (process.Handle != Process.GetCurrentProcess().Handle))
                {
                    MessageBox.Show("Test");

                    process.Kill();
                    Thread.Sleep(500);

                    killed = true;
                    MessageBox.Show("Test");

                }
            }

            if (!killed)
                break;

            processes =
                Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location));
        }

The only problem is that when I compare the 2 processes handle, when the process checked is my program instance, the handles are different.


Solution

  • Compare the processes by Id instead of Handle.