Obtenha o processo de execução, dado o identificador do processo
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.
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 int
s 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?