0

以下のコードを使用して、実行中のプロセスのベースアドレスを見つけています。他の目的のためのタイマー コントロール内にあります。ターゲット プロセスが実行されていない場合、ラベル テキストに「プロセスが実行されていません」と表示したいのですが、実行中のプロセスをチェックし続け、見つかった場合は次のコード ブロックに進みます。例外処理を使用した「試行」など、うまくいくと思われるいくつかの方法を試しましたが、ラベルを保持するために使用しているフォームがフリーズするだけで、c# は初めてです。ここにコードがあります、

private void timer1_Tick(object sender, EventArgs e)
    {
        #region BaseAddress
        Process[] test = Process.GetProcessesByName("process");
        int Base = test[0].MainModule.BaseAddress.ToInt32();
        #endregion
        //Other code
     }

実行時の例外は次のとおりです。「IndexOutOfRange 例外が処理されませんでした」 - インデックスが配列の境界外にありました。うまくいけば、誰かが助けてくれるでしょう。ありがとう。

4

3 に答える 3

2
private void timer1_Tick(object sender, EventArgs e)
    {
        #region BaseAddress
        Process[] test = Process.GetProcessesByName("process");
        if (test.Length > 0)
        {
            int Base = test[0].MainModule.BaseAddress.ToInt32();
        }
        else
        {
            myLabel.Text = "Process is not running";
        }
        #endregion
        //Other code
     }
于 2012-06-17T16:23:43.190 に答える
1

「プロセス」という名前のプロセスは存在しないと思います。実際のプロセス名を指定する必要があります。したがって、配列には要素が含まれていません。コードの 2 行目を実行する前に、配列に要素が含まれているかどうかをデバッグして確認し、エラー処理を追加するか、配列の長さが 0 より大きいことを確認してください。

于 2012-06-17T16:23:36.053 に答える
1

try–catch ブロックを使用してエラーを処理するのではなく、プロセスにアクセスする前にプロセスが見つかったかどうかを確認する必要があります。

private void timer1_Tick(object sender, EventArgs e)
{
    #region BaseAddress
    Process[] test = Process.GetProcessesByName("process");
    if (test.Any())
    {
        // Process is running.
        int Base = test[0].MainModule.BaseAddress.ToInt32();
        // Perform any processing you require on the "Base" address here.
    }
    else
    {
         // Process is not running.
         // Display "Process is not running" in the label text.
    }
    #endregion
    //Other code
 }
于 2012-06-17T16:24:33.323 に答える