如何在遍历 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 的堆栈语义。