2017-09-14 24 views
-1

我创建了一个在计算机上记录用户活动历史记录的应用程序。目前,我需要找出文件路径(例如с:\documents\FileName.docx),例如在Word中打开。我刚刚知道EXE文件的路径。我有进程ID,但在ManagementObject我没有找到任何有关可执行文件路径的信息。我怎样才能做到这一点?下面的方法我如何通过进程ID获取.exe文件路径。如何查找正在执行的Word或Excel文件的文件路径(例如文件 - 微软Word)。 С#

public static string GetMainModuleFilepath(int processId) 
     { 
      string wmiQueryString = "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId; 
      using (var searcher = new ManagementObjectSearcher(wmiQueryString)) 
      { 
       using (var results = searcher.Get()) 
       { 
        ManagementObject mo = results.Cast<ManagementObject>().FirstOrDefault(); 
        return (string)mo?["ExecutablePath"]; 
       } 
      }    
     } 

回答

0

我已经尝试了很多这些和下面是什么样的代码为我工作最好。

无论它是32位还是64位应用程序,这都应该可以工作。

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Management; 
using System.Text; 
using System.Threading.Tasks; 

namespace WmiTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int processID = 12624; // Change for the process you would like to use 
      Process process = Process.GetProcessById(processID); 
      string path = ProcessExecutablePath(process); 
     } 

     static private string ProcessExecutablePath(Process process) 
     { 
      try 
      { 
       return process.MainModule.FileName; 
      } 
      catch 
      { 
       string query = "SELECT ExecutablePath, ProcessID FROM Win32_Process"; 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 

       foreach (ManagementObject item in searcher.Get()) 
       { 
        object id = item["ProcessID"]; 
        object path = item["ExecutablePath"]; 

        if (path != null && id.ToString() == process.Id.ToString()) 
        { 
         return path.ToString(); 
        } 
       } 
      } 

      return ""; 
     } 
    } 
} 

请注意,你必须引用System.Management组装和使用System.Management命名空间

原始来源: https://stackoverflow.com/a/14668097/3850405

相关问题