有没有办法可以获得所有打开的应用程序列表和所有打开文件的列表?对于文件我只需要打开的文件(文档等)而不是OS的开放系统文件。应用程序也是如此(仅限浏览器,文档处理器等)。
我已经尝试过像EnumWindows这样的Windows API中的各种功能,但我无法得到我想要的功能。
我最终目标的一个例子是拥有这样的列表:
应用
Microsoft Word, 记事本, Mozilla Firefox
文件
foo.txt的, foo.mp3, foo.doc
我需要的只是名字,我不需要手柄等(即使我确定我必须使用它们来获得我想要的东西)
答案 0 :(得分: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";
}
对于已打开文件的列表,可以使用管理代码,这在某种程度上很难。这是代码项目的example,展示了同样的事情
答案 1 :(得分:1)
您可以使用Process.GetProcesses()获得正在运行的进程列表:http://msdn.microsoft.com/en-us/library/1f3ys1f9.aspx 但是如果它们公开了一些你知道的自动化界面,你就可以打开它们打开的文件。