Académique Documents
Professionnel Documents
Culture Documents
Ejecucin de procesos
Finalizacin de procesos
Monitorizacin de procesos
Operaciones de E/S
Ejecucin de procesos
La clase System.Diagnostics.Process permite crear y monitorizar procesos (accediendo a la
informacin que se visualiza en el Administrador de Tareas de Windows).
El mtodo Process.Start() equivale a la llamada ShellExecute del API de Windows (Win32) y
es el que deberemos utilizar para lanzar un proceso. Los parmetros del proceso se especifican
mediante un objeto de la clase ProcessStartInfo. Al encapsular una llamada al shell de Windows,
el mtodo Start tambin podemos usarlo para abrir un fichero de cualquier tipo de los que tengan
acciones asociadas en el registro de Windows.
Ejecucin de procesos
2 de 12
3 de 12
info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized;
Process.Start(info);
Lanzar el proceso adecuado para un fichero cualquiera:
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = "c:\\" ;
openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog.FilterIndex = 2 ;
openFileDialog.RestoreDirectory = true ; // Vuelve al directorio actual
if (openFileDialog.ShowDialog() == DialogResult.OK) {
System.Diagnostics.Process.Start(openFileDialog.FileName);
}
Abrir una URL:
System.Diagnostics.Process.Start("http://elvex.ugr.es/decsai/Csharp/");
Uso de los verbos del shell:
using System.Diagnostics;
...
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "Ade.jpg";
info.WorkingDirectory = "f://";
info.Verb = "edit"; // vs. "open" || "print"
Process.Start(info);
//
//
//
//
//
//
//
Verbos comunes
-------------open
Abre un ejecutable, documento o carpeta
edit
Edita un documento
print
Imprime un documento
explore Explora una carpeta
find
Inicia una bsqueda en el directorio especificado
4 de 12
Finalizacin de procesos
En los ejemplos anteriores, si quisiramos que nuestra aplicacin detuviese su ejecucin hasta que el
proceso lanzado finalizase su ejecucin, slo tendramos que llamar al mtodo WaitForExit:
La espera podra hacerse por un perodo de tiempo limitado si utilizamos un parmetro en la llamada
al mtodo WaitForExit:
Ejecucin invisible de comandos MS-DOS
proceso.StartInfo.FileName = "cmd.exe";
proceso.StartInfo.Arguments =
"/C dir \""+path+"\" >> \"" + salida +"\" && exit";
5 de 12
proceso.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proceso.StartInfo.CreateNoWindow = true;
proceso.Start()
proceso.WaitForExit(1000);
if (!proceso.HasExited()) {
proceso.Kill();
} else {
...
}
// 1 segundo de timeout
// Finalizamos el proceso
Adems, tambin podemos detectar cundo finaliza un proceso que hayamos lanzado si empleamos
el manejador de eventos Exited de la clase Process. De esta forma, no tenemos por qu bloquear
la ejecucin de nuestra aplicacin mientras esperamos la terminacin de un proceso:
Evento asociado a la terminacin de un proceso
6 de 12
La clase Process tambin nos permite provocar la terminacin de un proceso. sta se puede
realizar explcitamente utilizando los mtodos Kill() y CloseMainWindow(), siendo este ltimo el
mtodo recomendado, pues equivale a que el usuario de la aplicacin cierre sta de la forma usual.
Es decir, CloseMainWindow solicita cerrar la aplicacin como si el propio usuario cerrase la ventana
principal de la aplicacin (lo cual puede provocar la aparicin de mensajes de la aplicacin), mientras
que Kill finaliza el proceso "por las bravas", pudiendo ocasionar la prdida de datos que no hayan
sido previamente guardados.
En la siguiente seccin veremos cmo se puede forzar la finalizacin de un proceso y tambin
aprenderemos a acceder a la informacin relativa a los procesos que se estn ejecutando en una
mquina Windows (la misma informacin que figura en el Administrador de Tareas de Windows).
Monitorizacin de procesos
Monitor de procesos
7 de 12
8 de 12
listProcesses.Items.AddRange(procesos);
Cuando el usuario selecciona un proceso concreto, mostramos informacin detallada
acerca del proceso seleccionado (evento SelectedIndexChanged del ListBox):
9 de 12
Operaciones de E/S
En ocasiones nos interesa que la entrada de un proceso provenga directamente de la salida de otro
proceso. Enviar la salida a un fichero y despus leer el fichero no siempre es la mejor opcin, ya que
el uso de "pipes" resulta mucho ms eficiente para conectar distintos procesos. La clase Process
nos permite redireccionar los canales de E/S estndar (StdIn, StdOut y StdErr). Slo tenemos que
fijar
a
"true"
las
propiedades
RedirectStandardInput,
RedirectStandardOutput
y
RedirectStandardError, tras lo cual podemos acceder a las propiedades StandardInput,
StandardOutput y StandardError del proceso (objetos de tipo StreamReader y StreamWriter).
Una observacin: Process.Start utiliza por defecto la funcin ShellExecute del API Win32. Cuando
utilicemos redireccionamientos, la propiedad ProcessStartInfo.UseShellExecute debe estar
puesta a "false" antes de invocar al mtodo Process.Start.
10 de 12
Para los programas que no utilizan StdIn se puede utilizar el mtodo SendKeys para simular la
pulsacin de teclas:
Acceso al Bloc de Notas con SendKeys
Curso de C# - Procesos
11 de 12
Cualquier combinacin de teclas se puede enviar con SendKeys, lo que permite hacer prcticamente
cualquier cosa con una aplicacin Windows (siempre que nos aseguremos de que es la aplicacin
activa, la que tiene el foco).
No se pueden utilizar SendKeys hasta que no se haya creado y se visualice la ventana principal de
la
aplicacin,
por
lo
que
en
el
ejemplo
de
arriba
se
emple
el
mtodo
Process.WaitForInputIdle, que espera hasta que la aplicacin pueda aceptar entradas por
parte del usuario y cuyo funcionamiento es anlogo a Process.WaitForExit.
Acceso a recursos nativos de Windows
Con SendKeys se puede simular la pulsacin de cualquier combinacin de
teclas. No obstante, SendKeys se limita a enviar eventos de pulsacin de teclas
a la aplicacin que est activa en cada momento. Y no existe ninguna funcin
estndar en .NET que nos permita establecer la aplicacin activa, pero s en el
API nativo de Windows.
El API de Windows incluye una gran cantidad de funciones (no mtodos), del
orden de miles. En el caso que nos ocupa, podemos recurrir a las funciones
FindWindow y SetForegroundWindow del API Win32 para establecer la
aplicacin activa. Como estas funciones no forman parte de la biblioteca de
clases .NET, tenemos que acceder a ellas usando los servicios de
12 de 12
interoperabilidad con COM. Estos servicios son los que nos permiten acceder a
recursos nativos del sistema operativo y se pueden encontrar en el espacio de
nombres System.Runtime.InteropServices.
Para poder usar la funcin SetForegroundWindow, por ejemplo, tendremos que
escribir algo parecido a lo siguiente:
using System.Runtime.InteropServices;
...
[DllImport("User32",EntryPoint="SetForegroundWindow")]
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
Una vez hecho esto, ya podemos acceder a la funcin SetForegroundWindow
como si de un mtodo ms se tratase: