0

まず、適切なタイトルを付けることができなかったことをお詫び申し上げます。私は、Stackoverflow で質問することにしたまで、検索して検索して検索した後、ほぼ一日中私の中にあったアイデアに行き詰まりました!

だからここに私が立ち往生している場所があります:

(現在 C# でコード化された自動インストーラーを作成していますが、これはオランダ語です。これは非常にうまく機能しますが、ベースを完成させるために必要なものは 1 つだけです。例:

  • チェックリストボックスで「複数の」オブジェクトが選択されています。それらはチェックリストボックス自体から読み取られ、トリミングされ、その後起動されます。

これですべてが機能しました。たとえば、次のような待機メソッドを追加したかったのです。

  • インストールの「例」としての Malwarebytes & CCleaner。

両方をチェックして [開始] をクリックすると、両方のプログラムが起動します。私がやりたいことは、プログラムに 1 つのプログラムを開始するように指示することです。終了 (終了) したら、次のプログラムに進む必要があります。

しかし...問題があります。私のプログラムは配列で開始されるため、チェックされたすべてのオブジェクトを開始するよりも、複数のオブジェクトがチェックされている場合に基本的に機能します。そして、基本的に同じものに到達する方法が本当にわかりません:

  • 複数のオブジェクトが選択されている場合は、オブジェクトを開始し、目的の操作 (自動クリックなど) を行い、オブジェクトが閉じて閉じていることを確認したら、次のオブジェクトに移動し、完了するまで同じことを行います。プログレスバーで動作させたいのですが、紛らわしいように見えるため、プログレスバーを実際に調べたことはありません。

プロセスIDを見つけるコードがあるので、それで何かできるかもしれませんが、起動したアプリケーションでプロセスIDが同じになることは決してないので、それらが配列で起動すると、ちょっとした問題が発生します。

何をどのようにコーディングするか、これを行うかを理解してください。

これを機能させるために使用するコードは次のとおりです。

                string pad = Application.StartupPath;

            foreach (string checkedItem in checkedListBox1.CheckedItems)
            {
                if (checkedItem.Contains("."))
                {
                    string str = checkedItem;
                    if (str.Contains("."))
                    {
                        int index = str.IndexOf('.');
                        string folder = str.Substring(0, index);
                        try
                        {
                            bool started = false;
                            var process = new Process();
                            process.StartInfo.FileName = pad + "/data/" + folder + "/" + checkedItem;
                            started = process.Start();
                            var processID = process.Id;
                            var processNAAM = process.ProcessName;
                            textBox1.Text += "Gevonden - ID: " + processID + "     NAAM: " + processNAAM + Environment.NewLine;
                            textBox1.Text += DateTime.Now.ToString("HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo) + "  -  " + "Installatie Keuze wordt opgestart." + Environment.NewLine;
                            process.WaitForExit();

                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }
4

2 に答える 2

1

まず、CheckedListBox のCheckedItemsプロパティを使用すると、コードをより単純で短くすることができます。第二に、文字列をある文字列から別の文字列にコピーしても意味がありません。文字列は .NET では不変です。変更されることはありません。コピーを 1 つだけ残し、そこから切り取ることができます。

次に、 のメソッドを使用してSystem.IO.Path、拡張子なしでファイル名を切り取るか、「/」が多すぎたり少なすぎたりすることを気にせずにフル パスを作成できます。

3番目に、元の質問について-プロセスのリストに進む前に、オブジェクトを呼び出して待機させるWaitForExitだけです。Process

第三に

foreach (string checkedItem in checkedListBox1.CheckedItems)
{
   if (checkedItem.Contains("."))
   {
       string baseName = Path.GetFileNameWithoutExtension(checkedItem);
       string processPath = Path.Combine(pad, "data", baseName, checkedItem); 
       Process process = Process.Start(processPath);
       process.WaitForExit();
   }
}
于 2013-02-18T00:04:10.937 に答える
0

プロセスを開始する行 ( process.Start()) の後に、以下を追加するだけです。

process.WaitForExit()

これにより、ターゲットプロセスが終了するまで、含まれているスレッドが一時停止します。

于 2013-02-17T23:59:39.233 に答える