gpt4 book ai didi

c# - Process.GetProcesses(); 之间有什么关系?任务管理器中显示的是什么?

转载 作者:可可西里 更新时间:2023-11-01 11:29:16 27 4
gpt4 key购买 nike

我正在尝试做一些应该(并且可能)非常简单的事情。我希望用户能够定义一个进程(几乎肯定是从任务管理器中获取的),然后我的应用程序将根据正在运行的进程执行不同的操作。

我一直在使用 Process.GetProcesses() 来获取此信息,但我很难理解我所获取的数据以及它与任务管理器显示内容的关系。

我真正想要的是与任务管理器中的“名称”字段相同的进程名称列表。我可以使用 Path.GetFileName(theprocess.MainModule.FileName); 获取此信息,但在枚举某些进程时出现很多异常。这似乎(来自谷歌搜索)是​​意料之中的,尤其是在跨 64 位/32 位平台中,虽然我可以轻松地捕获和忽略这些,但它变成了一个异常缓慢的操作。

所以,我希望使用类似 process.ProcessName 的东西。乍一看,这似乎与任务管理器相同,但它会拉回一两个奇怪的任务,这些任务不会显示在任务管理器中。

我应该做其他事情,还是 process.ProcessName 就足够了?

顺便说一句,我只对枚举当前用户/ session 的进程感兴趣。

这是我的代码示例之一:

foreach (theprocess in processList)
{
try
{
string fileName = theprocess.MainModule.FileName;
currentProcessList.Add(fileName.ToLower());
}

catch (Exception e)
{


}
}

最佳答案

我从未使用过您的方法,但在我的应用程序中我使用 WMI 来迭代进程,如下所示:

List<ManagementObject> processInfo = processWmi.CreateRequest("SELECT * FROM Win32_Process");

processWmi 是我用于所有 WMI 查询的一个类,它具有额外的功能,可以在查询挂起时终止查询(WMI 似乎在某些服务器上这样做)。这个类的核心如下所示。

private static string _query;
private static string _scope;
private static List<ManagementObject> _data;
private static bool _queryComplete;
private int _timeout = 300;
private static readonly object Locker = new Object();

public List<ManagementObject> CreateRequest(string query, bool eatErrors = false, string scope = null)
{

try
{
lock (Locker)
{
_queryComplete = false;
AscertainObject.ErrorHandler.WriteToLog("Running WMI Query: " + query + " Timeout:" + _timeout, true);
_query = query;
_scope = scope;

Thread serviceThread = new Thread(RunQuery) { Priority = ThreadPriority.Lowest, IsBackground = true };
serviceThread.Start();
int timeLeft = _timeout * 10;
while (timeLeft > 0)
{
if (_queryComplete)
return _data;
timeLeft--;
Thread.Sleep(100);
}
if (eatErrors == false)
AscertainObject.ErrorHandler.WriteToLog("WMI query timeout: " + query, true, "");

serviceThread.Abort();
}
}
catch (Exception ex)
{
if (eatErrors == false)
AscertainObject.ErrorHandler.WriteToLog("Error Running WMI Query", true, ex.ToString());
}

return null;
}

public void SetRequestTimeout(int timeoutSeconds)
{
_timeout = timeoutSeconds;
AscertainObject.ErrorHandler.WriteToLog("WMI query timeout changed to " + timeoutSeconds + " seconds", true);
}

private void RunQuery()
{
try
{
ManagementObjectSearcher searcher = _scope != null ? new ManagementObjectSearcher(_scope, _query) : new ManagementObjectSearcher(_query);
List<ManagementObject> innerData = searcher.Get().Cast<ManagementObject>().ToList();
_data = innerData;
}
catch (Exception ex)
{
AscertainObject.ErrorHandler.WriteToLog("WMI query failed, may have invalid namespace", true, null, true);
_data = null;
}
_queryComplete = true;
}

您可以按如下方式从 WMI 结果中提取所需的数据(适当的类型转换以匹配我的 Process 类):

foreach (ManagementObject item in processInfo)
{
Process tempProcess = new Process
{
id = Convert.ToInt32((UInt32)item["ProcessID"]),
name = (String)item["Name"],
path = (String)item["ExecutablePath"],
parentID = Convert.ToInt32((UInt32)item["ParentProcessID"]),
handleCount = Convert.ToInt32((UInt32)item["HandleCount"]),
priority = Convert.ToInt16((UInt32)item["Priority"]),
threadCount = Convert.ToInt32((UInt32)item["ThreadCount"]),
workingSetMB = Convert.ToInt64((UInt64)item["WorkingSetSize"]) / 1048576,
peakWorkingSetMB = Convert.ToInt64((UInt32)item["PeakWorkingSetSize"]) / 1024,
pageFileUsageMB = Convert.ToInt64((UInt32)item["PageFileUsage"]) / 1024,
peakPageFileUsage = Convert.ToInt64((UInt32)item["PeakPageFileUsage"]) / 1024
};
try
{
//get owner info
object[] ownerInfo = new object[2];
item.InvokeMethod("GetOwner", ownerInfo);
tempProcess.processOwner = (string)ownerInfo[0];
}
catch
{
}
}

WMI 结果通常会很快返回,系统开销很小甚至没有。它们的行为也类似于 SQL 查询,您可以在其中使用适当的 WHERE 子句过滤结果。

这是您可以从 Win32_Process 获得的所有信息的链接: http://msdn.microsoft.com/en-us/library/aa394372(v=vs.85).aspx

关于c# - Process.GetProcesses(); 之间有什么关系?任务管理器中显示的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25141551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com