Pregunta

Estoy usando el siguiente método

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern int GetProcessId(IntPtr hWnd);

Para tratar de obtener el proceso de proceso para un proceso de ejecución y la única información que tengo es el HWND. Mi problema es que siempre devuelve el código de error 6 que es ERROR_INVALID_HANDLE. Pensé que podría cambiar el parámetro para ser de tipo int, pero eso tampoco funcionó. No puedo enumerar los procesos de ejecución porque puede haber más de 1 instancia en ejecución en cualquier momento.

¿Alguien puede ver si estoy haciendo algo mal?

NB: El proceso se genera desde un objeto de automatización expuesto al marco y solo proporciona la propiedad HWND. ¿Quizás hay otra forma de obtener el proceso de proceso ya que el código que escribí fue responsable de ejecutarlo en primer lugar?

Mi código se ve algo similar a esto ...

AutomationApplication.Application ExtApp = new AutomationApplication.Application (); extapp.run (); ...

¿Fue útil?

Solución

¿Cuál es la clase 'AutomationApplication.Application'? ¿Escribiste eso? ¿.Run () devuelve un PID?

Otros consejos

GetProcessid Obtiene el ID de proceso cuando se le da un mango de proceso, no un mango de ventana. En realidad es:

[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);

Si tienes un mango de ventana, entonces quieres el Getwindowthreadprocessid función:

[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);

Esto devuelve la ID de subproceso y coloca la ID del proceso en el param.

Ver un Ejemplo en Pinvoke, no hay necesidad de WIN32 Llame, ya que puede usar una API administrada:

API administrada alternativa: System.DiaGnitalics.Process Class contiene muchos métodos de módulos, procesos y subprocesos.

Por ejemplo:

using System.Diagnostics;
...
private void DumpModuleInfo(IntPtr hProcess)
{
    uint pid = GetProcessId(hProcess);
    foreach (Process proc in Process.GetProcesses())
    {
        if (proc.Id == pid)
        {
            foreach (ProcessModule pm in proc.Modules)
            {
                Console.WriteLine("{0:X8} {1:X8} {2:X8} {3}", (int)pm.BaseAddress,
                (int)pm.EntryPointAddress, (int)pm.BaseAddress + pm.ModuleMemorySize, pm.ModuleName);
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top