【发布时间】:2013-01-08 02:49:29
【问题描述】:
我正在尝试获取所有打开的应用程序的列表。具体来说,如果您打开任务管理器并转到应用程序选项卡,就会出现该列表。
我试过用这样的东西:
foreach (var p in Process.GetProcesses())
{
try
{
if (!String.IsNullOrEmpty(p.MainWindowTitle))
{
sb.Append("\r\n");
sb.Append("Window title: " + p.MainWindowTitle.ToString());
sb.Append("\r\n");
}
}
catch
{
}
}
就像我发现的几个示例一样,但这并不能为我提取所有应用程序。它只抓取了我在任务管理器中可以看到的或者我知道我已经打开的大约一半。例如,由于某种原因,此方法不支持 Notepad++ 或 Skype,但支持谷歌浏览器、计算器和 Microsoft Word。
有谁知道为什么这不能正常工作或如何做到这一点?
另外,一位朋友建议这可能是权限问题,但我以管理员身份运行 Visual Studio 并且它没有改变。
编辑:我遇到的问题是,我得到的大多数解决方案只返回一个所有进程的列表,这不是我想要的。我只想要打开的应用程序或窗口,例如任务管理器上显示的列表。不是每个进程的列表。
另外,我知道这里有错误的代码,包括空的 catch 块。这是一个一次性项目,只是为了弄清楚它是如何工作的。
【问题讨论】:
-
可能是因为这些应用没有主窗口标题。
-
如果你的程序有一个主窗口标题,你可以做这样的事情 Chris Process[] processes = Process.GetProcesses(); foreach (var proc in processes) { if (!string.IsNullOrEmpty(proc.MainWindowTitle)) Console.WriteLine(proc.MainWindowTitle); } 你也可以使用
WMImsdn.microsoft.com/en-us/library/windows/desktop/… -
您是否还在查看您正在复制和粘贴的代码?
-
并且,从不使用
try和空的catch { }。它只会掩盖错误并使错误无法找到。这就像说“我不在乎这是否有效。” -
克里斯我为你找到了一个可行的解决方案,我刚刚对其进行了测试,它会在应用程序选项卡上获取那些正在运行的进程,请参阅我更新的帖子