Pergunta

Alguém pode me dizer como posso capturar um processo de execução no C# usando a classe de processo se eu já souber o identificador?

Id prefere não ter que enumerar o método de processos de getRunning também. Pinvoke está ok, se possível.

Foi útil?

Solução

Em Plain C#, parece que você precisa percorrer todos eles:

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

O exemplo acima falha intencionalmente se o identificador não for encontrado. Caso contrário, você poderia usar obviamente SingleOrDefault. Aparentemente, não gosta de você solicitar o identificador de ID do processo 0, daí a condição extra.

Usando o Winapi, você pode usar GetProcessId. Não consegui encontrá -lo no pinvoke.net, mas isso deve fazer:

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

(A assinatura usa um DWORD, mas os IDs de processo são representados por ints no .NET BCL)

Parece um pouco estranho que você tenha uma alça, mas não um ID de processo. As alças de processo são adquiridas ligando OpenProcess, que leva um ID do processo.

Outras dicas

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;
    }
}

Parece não haver uma maneira simples de fazer isso pela API .NET. A questão é: de onde você obteve essa alça? Se da mesma maneira que você puder obter acesso ao ID dos processos, você pode usar:

Process.GetProcessById (int iD)

Você pode usar a chamada GetWindowThreadProcessid Winapi

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

Para obter o ID do processo - então obtenha um objeto de processo usando isso .....

Mas por que você não quer enumerar os IDs dos processos de execução?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top