C# - 循环foreach直到true

时间:2013-11-21 04:18:37

标签: c# loops foreach while-loop msdn

C#的新手。但由于工作环境,我必须“随时学习”。

我的代码在过去两天里一直在挣扎,我在这里消耗了尽可能多的问题和MSDN上的文章,但我认为他们让我更加困惑。

我使用我的代码启动应用A.应用程序A启动应用程序B(我无法启动应用程序B,我超越了它) 我想用我的代码做的是当应用程序B的MainWindowTitle可用时,隐藏窗口。

到目前为止,我只能用Thread.Sleep(xxx)来完成这个任务。在你看到下面的代码之前。 我想避免使用计时器。

我要做的是循环下面的代码直到它成立。

  

当应用A启动应用B时,MainWindowTitle可用几秒钟。但是代码运行得如此之快,以至于它还没有完成,代码已经完成。

IntPtr hWnd = IntPtr.Zero;
foreach (Process procList in Process.GetProcess())
{
    if (procList.MainWindowTitle.Contains("SAP Logon"))
    {
        hWnd = procList.MainWindowHandle;
    }
}
ShowWindow(hWnd, 0);

该代码仅在我之前使用类似的内容时才有效:

Thread.Sleep(10000);

在整个代码块之前。它工作的唯一原因是b / c它允许有足够的时间传递窗口打开并包含我正在寻找的标题。

我试过while循环。

  
      
  • 在'foreach'之外
  •   
  • 在'if'
  • 之外   
  • 围绕'foreach'(很快就锁定了系统......)哈哈!
  •   
  • 围绕'if'
  •   

我觉得以下其中一项应该有效,但事实并非如此,或者我完全搞砸了。

while (!procList.MainWindowTitle.Contains("SAP Logon")) { } // ! at the beginning OR
while (procList.MainWindowTitle.Contains("SAP Logon") == null) { } // equaling null OR
while (procList.MainWindowTitle.Contains("SAP Logon") < 0) { } // etc., etc.,
while (procList.MainWindowTitle.DOESNOTContain("SAP Logon")) { } // I know this is wrong but it almost seems like what I need...

有人有什么建议吗?我的大脑是炒鸡蛋,这是我完成这个应用程序所需的最后一点。 如果我唯一的选择是Thread.Sleep(),那就这样吧,但我宁愿不使用它。 最后一件事:我必须以.net 2.0为目标。

谢天谢地!

3 个答案:

答案 0 :(得分:6)

您使用while循环的想法应该有效。你可以尝试这样的事情:

IntPtr hWnd = IntPtr.Zero;
bool isFound = false;
while(!isFound)
{
  foreach (Process procList in Process.GetProcess())
  {
    if (procList.MainWindowTitle.Contains("SAP Logon"))
    {
        isFound = true;
        hWnd = procList.MainWindowHandle;
    }
  }
  Thread.Sleep(100); // You may or may not want this
}
ShowWindow(hWnd, 0);

答案 1 :(得分:1)

您可以只使用EXE本身的名称来检查,而不是在每个进程中检查应用程序的标题。我还会暂停一个好的措施。例如,使用记事本,您可以:

        Process[] ps;
        DateTime timeout = DateTime.Now.AddSeconds(30);
        do
        {
            System.Threading.Thread.Sleep(100);
            ps = Process.GetProcessesByName("notepad"); // <--- no path, AND no extension (just the EXE name)
        } while (ps.Length == 0 && timeout > DateTime.Now);
        if (ps.Length > 0)
        {
            ShowWindow(ps[0].MainWindowHandle, 0);
        }
        else
        {
            MessageBox.Show("Process Not Found within Timeout Period", "Process Failed to Spawn");
        }

答案 2 :(得分:0)

你有没有尝试过或看过这个:

.NET Events for Process executable start

这应该做你想要的......