1

有没有办法获得所有打开的应用程序的列表和所有打开的文件的列表?对于文件,我只需要我打开的文件(文档等)而不是操作系统的打开系统文件。应用程序(仅浏览器、文档处理器等)也是如此。

我已经尝试过来自 Windows API 的各种功能,例如 EnumWindows,但我无法得到我想要的。

我的最终目标的一个例子是有这样的列表:

应用

Microsoft Word、记事本、Mozilla Firefox

文件

foo.txt、foo.mp3、foo.doc

我需要的只是名称,我不需要句柄等(即使我确信我必须使用它们来获得我想要的东西)

4

2 回答 2

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

对于打开的文件列表,可以使用托管代码,这有点困难。这是一个关于代码项目的例子,展示了同样的事情

于 2011-01-21T10:23:25.140 回答
1

您可以使用 Process.GetProcesses() 获得正在运行的进程列表:http: //msdn.microsoft.com/en-us/library/1f3ys1f9.aspx 但是,如果它们公开了一些自动化接口,您可以打开它们的文件知道。

于 2011-01-21T10:26:18.377 回答