2010-10-02 18 views
8

Estoy intentando crear una aplicación que realice acciones en momentos específicos (muy parecido al Programador de tareas de Windows). Actualmente estoy usando Process.Start() para iniciar el archivo (o exe) requerido por la tarea.Proceso de suspensión iniciado con System.Diagnostic.Process.Start ("FileName")

Estoy iniciando un proceso llamando a un archivo (un .mp3) y el proceso inicia WMP (ya que es la aplicación predeterminada). Hasta aquí todo bien. Ahora quiero matar ese proceso. Sé que es un comportamiento normal para Process.Start (string, string) no devolver nada (null en C#) en este caso.

Entonces me pregunto cómo puedo cerrar WMP cuando lo llamé a través de Process.Start (string, string) ??

Editar:

Tenga en cuenta que yo no estoy abriendo WMP directamente con Process.Start() y esta es la línea con la que corro el proceso:

VB: Me._procs.Add (Process.Start (Me._procInfo))

C#: this._procs.Add (Process.Start (this._procInfo))

_procInfo es un ejemplo ProcessStartInfo. _procInfo.FileName es "C: \ route \ myFile.mp3". Es por eso que WMP abre. En cualquier caso, todos los métodos de Start(), a excepción de la instancia-uno que devuelve un valor booleano, no devuelven nada (nulo en C#), porque WMP no es el proceso que se creó directamente (tenga en cuenta que se ejecuta WMP y la canción sí se reproduce).

+0

Que yo sepa, 'Process.Start' solo devolverá' null' si no se inició realmente ningún proceso, p. se reutilizó un proceso existente para cargar el documento (en su caso, un archivo mp3). ¿Realmente quieres estar matando un proceso? ¿Tu código realmente no comenzó? – Ani

+0

@Ani - el inicio estático llama a todos los procesos de retorno pero la función miembro devuelve bool –

+0

@Steve Townsend: Correcto, pero creo que el OP está hablando del método estático. Si ya estuviera disponible una referencia a un objeto 'Proceso' no nulo, entonces el problema no existiría. – Ani

Respuesta

8

No lo hagas de esta manera.

No está claro si la intención de su programa es 'Ejecutar siempre con Windows Media Player' o 'Iniciar con el reproductor de MP3 registrado', que podría ser, por ejemplo, iTunes.

Si necesita WMP, use Process.Start con la ruta completa al reproductor de Windows Media.

Si necesita el reproductor de MP3 registrado, puede encontrar el exe correcto usando the code shown here. Nuevamente, inicie el proceso con esta ruta de acceso exe, pasando el MP3 como parámetro.

+0

Justo la forma en que decimos gracias aquí en SO. – PedroC88

+0

Gracias! También me has dado más de 3 k. :) –

18

Process.Start (string, string) le devuelve un recurso de proceso que puede utilizar para controlar aún más el nuevo proceso.

Process newProcess = Process.Start("param1", "param2"); 
if (newProcess != null) 
    newProcess.Kill(); 

La misma estructura funciona si se utiliza Process.Start(string), o cualquier otra sobrecarga Process.Start estática.

Process.Start() es una función miembro y asocia un Process nuevo o reutilizado con el componente Process identificado por este. El comportamiento de este método depende de las propiedades del proceso identificado por this.

5

dos maneras:

1-

Process customProc = Process.Start("ExecutablePath", "Argument(s)"); 
customProc.Kill() 

2-

Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("ProcessName") 
For Each p As Process In pProcess 
p.Kill() 
Next 
+0

La cuestión es que no soy el que está iniciando el programa (solo estoy llamando al archivo y Windows maneja el programa con el que debería abrirse) Process.Start no devuelve nada (nulo para C#). – PedroC88

2

he intentado abrir el archivo .txt y el proceso de mi editor de texto fue devuelto, También probé. mp3 por WMP y devolvió nulo. Entonces depende de la aplicación. ¿Necesitas ejecutar tu mp3 solo con WMP? Si no, definitivamente puede crear la aplicación que devolverá el objeto de proceso.

3

Si está dejando que el programa de Windows registrado abra el archivo, en lugar de elegir el programa que desea. Entonces te aconsejo que no mates el proceso.

La razón de esto es que dice que su programa utiliza la aplicación predeterminada, pero esa aplicación ya está en uso y contiene datos no guardados. Un usuario no estaría feliz de que su programa supere su aplicación con el nuevo archivo y luego elimine el proceso que ya estaba siendo utilizado por el usuario para otro propósito. Claro, puede que no esté en uso, pero debes considerar el peor de los casos.

Como tal, recomiendo lo que se ha sugerido. use Process.Start() con la ruta completa al programa que se utilizará y el archivo que se abrirá.

1

proc = Process.Start(filename) debería funcionar, pero como usted dice, devuelve nulo en lugar de un proceso.

Eso parece ser inherente a Windows Media Player. Otras aplicaciones devuelven el proceso. Puede obtener el proceso del Reproductor de Windows Media especificando la aplicación en el método de inicio.

proc = Process.Start("C:\Program Files\Windows Media Player\wmplayer.exe", filename) 

Entonces puede matarlo normalmente.

proc.Kill() 

es probable que necesite para obtener la ubicación de la aplicación assiciated con archivos .mp3 desde el registro.

Cuestiones relacionadas