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

我认为名为“进程”的进程不存在。您需要提供一个真实的进程名称。所以数组不包含任何元素。在执行代码的第二行之前,尝试调试以查看数组是否包含任何元素并添加错误处理或数组长度大于 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 回答