2011-01-21 4 views
1

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

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

Пример того, что моя конечная цель будет, чтобы иметь списки, как это:

Приложения

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

Файлы

Foo. txt, foo.mp3, foo.doc

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

+0

Файлы открываются программами. Вы их не открываете. Вам нужно спросить программы, что они используют. Поэтому вам нужно либо прочитать их API, либо если вам повезет, они могут иметь его в заголовке –

+0

Да, но программы запрашивают ОС для открытия файлов. Итак, ОС, вероятно, знает, какие файлы используются и по какой программе, не так ли? – user579674

+1

Вы пробовали список процессов .Net? (System.Diagnostics) Process [] processList = Process.GetProcesses(); –

ответ

2

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

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

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

+0

Прост в использовании System.Diagnostic.Process.GetProcesses() –

+0

Предлагаемый код работает, но возвращает все исполняемые файлы, которые в настоящее время запущены, включая программы, которые запускаются в фоновом режиме или системных программах. Не могу ли я получить список программ, которые пользователь начал? – user579674

+0

@user. Единственный способ, которым я знаю, - это получить владельца процесса и проверить, является ли он «Системой», тогда он не запускается пользователем. Я обновил ответ с помощью кода, чтобы проверить владельца процесса. – deadlock

1

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