Click here to Skip to main content
Click here to Skip to main content

Killing a process using MainWindowTitle

, 27 Feb 2013 CPOL
Rate this:
Please Sign up or sign in to vote.
Using the MainWindowTitle property to close a running program by killing the associated process.

Introduction  

I'm a Fox programmer, I use the VFP9 editor for my everyday programming work. I always run two sessions of vfp9.exe, one for the development environment and the other for testing. I write code, run the application, trace the written code, and see if it works and check if there is a problem. Many times I reach a point where I have to kill the vfp9.exe process from the list of processes when the program is trapped in an not so trivial error that can not be ignored.

The Problem

The problem is that I do not need to open the Task Manager every time and kill the process of the testing environment, so I created a DOS batch program file to do that job using the "TASKKILL" command. But the only information I know is the exe name, i.e., vfp9.exe, and I have no information about the process ID # to kill a specific process, not all instances, so I always issue the command.

>taskkill  /IM vfp9.exe

which kills all the running instances. I needed to only kill the stuck testing vfp9.exe instance, not the development one.

The suggested solution

I discovered a property in the class System.Diagnostics.Process called MainWindowTitle. I found that I can use it to kill only the instance I need.

First I ran the testing instance with a specific caption that distinguishes it from another one, say that contains the word 'test'.

Then in my C# program I define an array of all running processes  as follows:

using System.Diagnostics
... 
Process[] processes = Process.GetProcesses();

I then issue a foreach loop to check the process I intend to close:

foreach (Process pr in processes)            { 
  if (pr.ProcessName.ToLower().Contains("vfp"))
    if (pr.MainWindowTitle.ToLower().Contains("test"))
      pr.CloseMainWindow();
}

Here I first check if the process name contains "vfp", and that its title contains "test", then I close it, and that is the whole idea.

I developed the attached source code more generally to kill any process with any title. It gets the text that is to be checked in the process name and the process window title from a text file with the same name as the exe file. To achieve this target I create a text file with the same name as the exe name and insert in it the line "vfp|test". When the program runs, it gets the two strings separated by the pipe "|" into a list and then for each process, loops over  this list doing the same checks as above. Here is the full code:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
namespace KillProcess
{
    class Program
    {
        static void Main(string[] args)
        {
            string txtFl = System.Reflection.Assembly.GetEntryAssembly().GetName().Name+".txt";
            List<string> getKilled = new List<string>();
            if (File.Exists(txtFl))
            {
                //read file lines to the list
                using (StreamReader sr = File.OpenText(txtFl))
                {
                    string s;
                    while ((s = sr.ReadLine()) != null)
                    {
                        // in case that the pipe does not exist in the line to always keep the word 
                        // contained in the title in the even index in the list
                        s = (s.Contains("|") ? s : s + "|"); 
                        getKilled.AddRange(s.ToLower().Split('|'));
                    }
                }
            }
            if (getKilled.Count == 0) return; //the file is not found or empty
            // define the processes array, loop over it 
            Process[] processes = Process.GetProcesses();
            foreach (Process pr in processes)
                for (int i = 0; i < getKilled.Count; i += 2)
                    if (!string.IsNullOrEmpty(getKilled[i]) && !string.IsNullOrEmpty(getKilled[i + 1]))
                        if (pr.ProcessName.ToLower().Contains(getKilled[i]))
                            if (pr.MainWindowTitle.ToLower().Contains(getKilled[i + 1]))
                                pr.CloseMainWindow();
        }
    }
}

Conclusion 

We can add more lines to the text file that has the same name as the program exe name, but be careful when filling up this file to not close critical programs.

To use this program practically, I created a shortcut of the exe KillProcess.exe on my desktop and associated it with a shortcut key combination to easily call the program. This program has no interface.

I hope you find it useful.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Tarek Elqusi
Software Developer (Senior)
Egypt Egypt
I am an ERP developer using VFP9
I started as a Clipper 5.2 with DBase III+ in 1995, I worked with Access 2.0
Then I converted to VFP5.0 then VFP9, I worked on an ERP application written by FoxPro2.6
 
Recently, I started learning C#
I have a tendency to do generic work and build generic functions, I try to do that using C#
 
I'm preparing myself now to be a Framework C# programmer
First step I'll read the C# specification, when done I'll update this, I've already started this in Feb-27-2013

Comments and Discussions

 
BugMainWindowTitle property Pinmembermiguelaup18-Dec-12 11:33 
Questionan important change PinmemberTarek Elqusi2-Dec-12 19:04 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.141022.2 | Last Updated 27 Feb 2013
Article Copyright 2012 by Tarek Elqusi
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid