按流程

时间:2015-05-07 23:02:38

标签: c# kernel32 ntdll

我试图检索当前进程的文件名。

ie:如果我有文件" test.txt"在记事本中打开,我需要得到类似" c:\ folder \ test.txt"

以下代码返回流程信息,包括软件路径。 (即:" c:\ windows \ system32 \ notepad.exe")。

[DllImport("user32.dll", EntryPoint = "GetForegroundWindow", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetForegroundWindow();

[...]

public static string GetFilePathName()
{
    uint procId = 0;
    int hWnd = GetForegroundWindow();
    GetWindowThreadProcessId(hWnd, out procId);
    var proc = Process.GetProcessById((int)procId);
}

是否可以使用此Process Class来实现当前进程正在处理的已打开文件名/路径?

2 个答案:

答案 0 :(得分:0)

这可能是可能的,但您必须真正查看某些互操作以找出在记事本中打开的特定文件。

您可以使用System.Diagnostics.Process类从.NET获取大量通用​​流程信息,这非常强大。

https://msdn.microsoft.com/en-us/library/z3w4xdc9%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

例如,让您的计算机上运行所有记事本进程。

Process[] notepads = Process.GetProcessesByName("notepad");

您也可以获得一个可以执行此操作的库:

How do I get the list of open file handles by process in C#?

答案 1 :(得分:0)

在C#中,我有以下解决方案。我写这个来识别Notepad.exe中打开的文件,以便调用Kill()。

你的解决方案将取决于窗口标题,在这种情况下,我可以预期记事本中的格式为“无标题 - 记事本”,“config.ini - 记事本”,“readme.txt - 记事本”等我会在哪里拆分char' - '并修剪空白区域。

public static void getFileNameByProcess(string process)
{
    foreach (Process p in Process.GetProcessesByName(process))
    {
        string[] split = p.MainWindowTitle.Split('-');
        if (split.Length > 0)
            Console.WriteLine("\"" + split[0].Trim() + "\"");
    }
}

像这样使用:getFileNameByProcess("Notepad");

示例文件名:

  1. “的config.ini”
  2. “README.TXT”
  3. “无标题”
  4. 使用这些文件名,你可以递归搜索一个目录,如果你对它的位置有一个大概的了解,那么我会提醒像这样的昂贵的电话