Search code examples
c#winapifilewindow-handles

C# List currently open files and programs


Is there a way I can get a list of all open applications and a list of all open files? For the files I only need the files that I opened (documents etc) not OS's open system files. The same for the applications (only browsers, document processors etc).

I already tried various functions from the Windows API like EnumWindows but I couldn't get what I wanted.

An example of what my ultimate goal would be, is to have lists like this:

Applications

Microsoft Word, Notepad, Mozilla Firefox

Files

foo.txt, foo.mp3, foo.doc

What I need is just the names, I don't need handles etc (even though I'm sure I'll have to use them to get what I want)


Solution

  • You can get a list of running processes with their information

    public static string ListAllProcesses()
    {
        StringBuilder sb = new StringBuilder();
    
        // list out all processes and write them into a stringbuilder
        ManagementClass MgmtClass = new ManagementClass("Win32_Process");
    
        foreach (ManagementObject mo in MgmtClass.GetInstances())
        {
            sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
            sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
            sb.Append(Environment.NewLine);
        }
        return sb.ToString();
    }
    

    The only method (That I know) to see if the process is opened by user or system is to check it's owner. If it's system, then it's not run by user:

    //You will need to reference System.Management.Dll and use System.Management namespace
    public string GetProcessOwner(string processName)
            {
                string query = "Select * from Win32_Process Where Name = \"" + processName + "\"";
    
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
                ManagementObjectCollection processList = searcher.Get();
    
                foreach (ManagementObject obj in processList)
                {
                    string[] argList = new string[] { string.Empty, string.Empty };
                    int returnVal = Convert.ToInt32(obj.InvokeMethod("GetOwner", argList));
                    if (returnVal == 0)
                    {
                        // return DOMAIN\user
                        string owner = argList[1] + "\\" + argList[0];
                        return owner;
                    }
                }
    
                return "NO OWNER";
            }
    

    For the list of opened files, It is possible to do using Managed Code which is somehow hard. Here is an example on codeproject demonstrating the same matter