2017-07-23 92 views
0
private static string getPath(object id11) 
    { 
     string wmiQuery = string.Format("select CommandLine from Win32_Process where ProcessId={0}", id11); 
     using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery)) 
     { 
      using (ManagementObjectCollection retObjectCollection = searcher.Get()) 
      { 
       foreach (ManagementObject retObject in retObjectCollection) 
       { 
        if (retObject["CommandLine"] != null) 
        { 
         string s= (string.Format("[{0}]", retObject["CommandLine"])); 
         string k = s.Substring(s.IndexOf("EXE")+4); 
         k = k.Remove(k.IndexOf("]")); 
         return k; 
        } 
        return null; 
       } 
       return null; 
      } 
     } 

我使用此代码获取记事本完整路径。当记事本文件使用双击打开时,此代码工作正常。但是,当我打开文件里面的记事本像(文件 - >打开)...比这段代码不工作得到一个完整的路径。有没有什么方法可以找到像这样打开文件的路径。还有一件事我需要文件路径不记事本可执行文件路径。或者建议我一些其他解决方案。从C#中的进程获取文件的完整路径?

+2

因此,您正在寻找在另一个程序(如记事本)中使用该应用程序中的菜单打开的文档的完整路径?对我来说似乎是不可能的,因为你需要知道内部工作情况,并且该信息需要被该应用程序公开。问题的标题有点让人误解,因为你没有在寻找过程的路径。 –

+1

这听起来像是一个XY问题。你有什么使用情况,导致你想知道哪些文件在记事本中打开?你想解决什么问题? – CodeCaster

+0

这用于回顾OLE的旧日,程序会发布他们用一个“moniker”打开的文件,这个文件是通过迭代Running Object Table找到的。 OLE死了,过期了​​,推开雏菊,去制造它的制造者,它是一只死的鹦鹉。除非您知道有关该流程的很多*或者愿意以某种方式进行合作,否则您无法开展此项工作。 –

回答

1

您的代码查看发送到进程的命令行参数。正如你正确地发现的那样,当你双击文件(.txt或.doc)时,它可能会作为命令行参数发送到文件。在这些情况下,您的解决方案会正确找到该文件。

但是,当您从应用程序打开文件时,没有命令行参数。

一种方法是使用像Handle这样的工具来获取打开文件的进程列表。

样品屏幕截图:

enter image description here

可以使用Process类来运行它,并解析输出。

某些进程(如记事本)不会锁定文件。所以,这个工具不会给你这些文件的名字。

+0

谢谢。其他可能的解决方案在这里,我只提到记事本,但我需要为所有应用程序工作,如(窗口照片查看器,vlc播放器...) –