如何在遍历 GetProcessesByName 时使用 for 循环而不是 foreach 循环
How to use for loop instead of foreach loop in traversing GetProcessByName
我一直在互联网上搜索以获取应用程序的所有进程。到目前为止,所有遍历它的实现都是使用我不熟悉的 foreach 循环。它可以工作,但如果我不理解它,我就不能高枕无忧。所以我想问问是否有人可以告诉我如何使用 for 循环实现这样的代码。
System::Diagnostics::Process^ current = System::Diagnostics::Process::GetCurrentProcess();
for each (System::Diagnostics::Process^ process in System::Diagnostics::Process::GetProcessesByName(current->ProcessName))
if (process->Id != current->Id)
{
// process already exist
}
我正在使用 visual studio c++/clr btw,因此 ::
因为它不在 c# 中。
GetProcessesByName
returns a cli::array,因此使用它及其长度 属性 进行迭代。
cli::array<Process^>^ processes = Process::GetProcessesByName(current->ProcessName);
for (int i = 0; i < processes->Length; i++)
{
if (processes[i]->Id != current->Id)
{
// process already exist
}
}
也就是说,可能有更好的方法来执行此操作。
您似乎在尝试查看是否有您的应用程序 运行ning 的另一个副本,以便您可以向用户显示一条 "App is already running, switch to that one instead" 消息。
问题是这里的进程名只是你的EXE的文件名,没有路径或"EXE"扩展名。尝试将您的应用程序重命名为 "Notepad.exe" 和 运行 几份 Windows 记事本,您会看到它们都显示在 GetProcessesByName 结果中。
更好的方法是创建一个命名的 Mutex,并在启动时检查其存在 and/or 锁定状态。
这是一个可以做到这一点的答案。 Prevent multiple instances of a given app in .NET?它是用C#写的,但是可以翻译成C++/CLI。翻译中唯一值得注意的是它使用了 C# using
语句;在 C++/CLI 中,这将是行 Mutex mutex(false, "whatever string");
,使用 C++/CLI 的堆栈语义。
我一直在互联网上搜索以获取应用程序的所有进程。到目前为止,所有遍历它的实现都是使用我不熟悉的 foreach 循环。它可以工作,但如果我不理解它,我就不能高枕无忧。所以我想问问是否有人可以告诉我如何使用 for 循环实现这样的代码。
System::Diagnostics::Process^ current = System::Diagnostics::Process::GetCurrentProcess();
for each (System::Diagnostics::Process^ process in System::Diagnostics::Process::GetProcessesByName(current->ProcessName))
if (process->Id != current->Id)
{
// process already exist
}
我正在使用 visual studio c++/clr btw,因此 ::
因为它不在 c# 中。
GetProcessesByName
returns a cli::array,因此使用它及其长度 属性 进行迭代。
cli::array<Process^>^ processes = Process::GetProcessesByName(current->ProcessName);
for (int i = 0; i < processes->Length; i++)
{
if (processes[i]->Id != current->Id)
{
// process already exist
}
}
也就是说,可能有更好的方法来执行此操作。
您似乎在尝试查看是否有您的应用程序 运行ning 的另一个副本,以便您可以向用户显示一条 "App is already running, switch to that one instead" 消息。
问题是这里的进程名只是你的EXE的文件名,没有路径或"EXE"扩展名。尝试将您的应用程序重命名为 "Notepad.exe" 和 运行 几份 Windows 记事本,您会看到它们都显示在 GetProcessesByName 结果中。
更好的方法是创建一个命名的 Mutex,并在启动时检查其存在 and/or 锁定状态。
这是一个可以做到这一点的答案。 Prevent multiple instances of a given app in .NET?它是用C#写的,但是可以翻译成C++/CLI。翻译中唯一值得注意的是它使用了 C# using
语句;在 C++/CLI 中,这将是行 Mutex mutex(false, "whatever string");
,使用 C++/CLI 的堆栈语义。