2009-08-14 11 views
8

¿alguien me puede decir cómo puedo capturar un proceso en C# usando la clase de proceso si ya conozco el manejador?Proceso de ejecución dado el proceso handle

Id más bien no debería tener que enumerar tampoco el método de procesos de getrunning. pInvoke está bien si es posible.

Respuesta

8

En la llanura C#, parece que hay que recorrer todos ellos:

// IntPtr myHandle = ... 
Process myProcess = Process.GetProcesses().Single(
    p => p.Id != 0 && p.Handle == myHandle); 

El ejemplo anterior falla intencionadamente si no se encuentra el mango. De lo contrario, podría usar SingleOrDefault. Aparentemente, no le gusta que solicite el identificador de proceso 0, de ahí la condición adicional.

Usando WINAPI, puede usar GetProcessId. No podía encontrar en pinvoke.net, pero esto debería hacer:

[DllImport("kernel32.dll")] 
static extern int GetProcessId(IntPtr handle); 

(firma utiliza un DWORD, pero los identificadores de proceso están representadas por int s en el .NET BCL)

Parece una Es extraño que tengas un identificador, pero no una ID de proceso. Los identificadores de proceso se adquieren llamando al OpenProcess, que toma una ID de proceso.

+0

recibo un mensaje de acceso denegado (excepción win32)? – Grant

+0

Solucionado, pero quizás debería usar WINAPI en su lugar. Eso es lo que preferiste en primer lugar :) – Thorarin

+1

process.handle da acceso denegado pero. ** process.MainWindowHandle ** se ejecuta sin errores –

3
using System.Diagnostics; 

class ProcessHandler { 
    public static Process FindProcess(IntPtr yourHandle) { 
     foreach (Process p in Process.GetProcesses()) { 
      if (p.Handle == yourHandle) { 
       return p; 
      } 
     } 

     return null; 
    } 
} 
2

Parece que no hay una forma sencilla de hacerlo con la API de .NET. La pregunta es, ¿de dónde sacaste esa manija? Si por el mismo camino se puede obtener acceso a los procesos de identificación, se puede utilizar:

Process.GetProcessById (int iD)

+0

Obteniéndolo por ID sin duda será mejor/más fácil, pero es posible por el mango. Ver las otras respuestas – Thorarin

+0

una API expone el HWND, pero no el ID – Grant

+0

La pregunta sigue siendo, de dónde proviene el identificador. Si se usa una API win32, quizás se deba emitir otra llamada API para obtener la identificación del proceso desde el identificador. Otro problema es que los identificadores solo son válidos dentro del mismo proceso, los ID son de todo el sistema –

1

Se podría utilizar la llamada GetWindowThreadProcessId WinAPI

http://www.pinvoke.net/default.aspx/user32/GetWindowThreadProcessId.html

Para obtener el identificador de proceso - a continuación, obtener un objeto Proceso usando eso .....

¿Pero por qué no quieres enumerar los identificadores de los procesos en ejecución?

+0

Ese toma un identificador de ventana. Él tiene un mango de proceso. El WINAPI 'GetProcessId' es lo que necesita. – Thorarin

Cuestiones relacionadas