C # Список в настоящее время открытых файлов и программ - PullRequest
1 голос
/ 21 января 2011

Можно ли получить список всех открытых приложений и список всех открытых файлов? Для файлов мне нужны только те файлы, которые я открыл (документы и т. Д.), А не открытые системные файлы ОС. То же самое для приложений (только браузеры, процессоры документов и т. Д.).

Я уже пробовал различные функции из Windows API, такие как EnumWindows, но не смог получить то, что хотел.

Примером моей конечной цели является создание списков, подобных этому:

Приложения

Microsoft Word, Блокнот, Mozilla Firefox

Файлы

foo.txt, foo.mp3, foo.doc

Мне нужны только имена, мне не нужны ручки и т. Д. (Хотя я уверен, что мне придется использовать их для получения того, что я хочу)

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Вы можете получить список запущенных процессов с их информацией

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();
}

Единственный метод (который я знаю), чтобы узнать, открыт ли процесс пользователем или системой, это проверить его владельца.Если это система, то она не запускается пользователем:

//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";
        }

Для списка открытых файлов, это можно сделать с помощью управляемого кода, что несколько сложно.Вот пример для проекта кода, демонстрирующий тот же вопрос

1 голос
/ 21 января 2011

У вас может быть список запущенных процессов с Process.GetProcesses (): http://msdn.microsoft.com/en-us/library/1f3ys1f9.aspx Но вы можете иметь файл, который у них открыт, если они предоставляют какой-то интерфейс автоматизации, который вы знаете.

...