3

我正在尝试检索当前进程的文件名。

即:如果我在记事本中打开了文件“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);
}

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

4

2 回答 2

1

在 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. “配置.ini”
  2. “自述文件.txt”
  3. “无标题”

使用这些文件名,如果您大致了解目录的位置,则可以递归搜索目录,但是我会警告像这样的昂贵调用

于 2016-06-23T20:31:04.087 回答
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");

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

如何在 C# 中按进程获取打开文件句柄的列表?

于 2015-05-07T23:09:00.383 回答