OK scusate ecco il codice di controllo:

private void btnApri_Click(object sender, EventArgs e)
{
Int32 i;
const Int32 SW_RESTORE = 9;

// istanzio l'oggetto
Processo = new Process();

// nessun processo
Processo = null;

Process[] allprocess = Process.GetProcesses();

if (IdProcessoCartellaDati.HasValue)
{
try
{
for (i = 0; i < allprocess.Length; i++)
{
if (IdProcessoCartellaDati == allprocess[i].Id)
{
MessageBox.Show("Processo già presente: " + IdProcessoCartellaDati.ToString() + " - " + allprocess[i].Id.ToString());
}
}

// legge il vecchio processo
Processo = Process.GetProcessById(IdProcessoCartellaDati.Valu e);

// ripristina la finestra (dimensioni)
ShowWindow(Processo.MainWindowHandle, SW_RESTORE);
// e la porta in primo piano
BringWindowToTop(Processo.MainWindowHandle);
}
catch (ArgumentException)
{
// il processo non c'è più: NOP
}
}

if(Processo == null)
{
// istanzia il processo
Processo = new Process();

// nome del processo
Processo.StartInfo.FileName = "explorer.exe";

// la cartella da aprire
Processo.StartInfo.Arguments = "C:\\Dati\\Produzione";

// controllo di eventuali errori
Processo.StartInfo.ErrorDialog = true;
Processo.StartInfo.ErrorDialogParentHandle = Handle;
Processo.StartInfo.UseShellExecute = true;

try
{
// esegue l'apertura della cartella
Processo.Start();

// memorizza l'id del processo
IdProcessoCartellaDati = Processo.Id;
}
catch (Exception)
{
// gli errori sono gestiti da Windows
}

// rilascia le risorse
Processo.Dispose();

}
}