簡體   English   中英

C# - 循環foreach直到true

[英]C# - Loop foreach until true

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'周圍(這很快就鎖定了系統......)哈!
  • 圍繞'如果'

我覺得以下其中一個應該可行,但它沒有,或者我完全搞砸了。

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...

有人有什么建議嗎? 我的大腦是炒雞蛋,這是我完成這個應用程序所需的最后一點。 如果我唯一的選擇是IS Thread.Sleep() ,那就這樣吧,但我寧願不使用它。 最后一件事:我必須以.net 2.0為目標。

非常感謝你!

您使用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);

您可以只使用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");
        }

你有沒有嘗試或看過這個:

用於Process可執行文件的.NET事件

這應該做你想要的......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM