2009-08-14 9 views
8

quelqu'un peut-il me dire comment je peux capturer un processus en cours dans C# en utilisant la classe de processus si je connais déjà le handle?Obtenir le processus en cours donné handle de processus

L'ID ne doit pas non plus avoir à énumérer la méthode des processus getrunning. pInvoke est ok si possible.

Répondre

8

En plaine C#, il semble que vous devez parcourir tous:

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

L'exemple ci-dessus échoue volontairement si la poignée ne se trouve pas. Sinon, vous pouvez bien sûr utiliser SingleOrDefault. Apparemment, il n'aime pas que vous demandiez le handle du processus ID 0, d'où la condition supplémentaire.

En utilisant le WINAPI, vous pouvez utiliser GetProcessId. Je ne pouvais pas trouver sur pinvoke.net, mais cela devrait faire:

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

(signature utilise un DWORD, mais les ID de processus sont représentés par int s dans la BCL .NET)

Il semble peu bizarre que vous ayez un handle, mais pas un ID de processus cependant. Les handles de processus sont acquis en appelant le OpenProcess, qui prend un ID de processus.

+0

Je reçois un message d'accès refusé (exception win32)? – Grant

+0

Correction, mais vous devriez peut-être utiliser le WINAPI à la place. C'est ce que vous préférez en premier lieu :) – Thorarin

+1

process.handle donne accès refusé mais. ** process.MainWindowHandle ** fonctionne sans erreur –

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

Il ne semble pas y avoir de moyen simple de faire cela par l'API .Net. La question est, d'où vous avez obtenu cette poignée de? Si la même façon, vous pouvez avoir accès au processus ID, vous pouvez utiliser:

Process.GetProcessById (int iD)

+0

L'obtenir par ID serait certainement mieux/plus facile, mais c'est possible par handle. Voir les autres réponses – Thorarin

+0

une API expose le HWND mais pas l'ID – Grant

+0

La question demeure, d'où vient le handle. Si une API win32 est utilisée, un autre appel d'API doit peut-être être lancé pour obtenir l'ID du processus depuis le descripteur. Un autre problème est, que les poignées ne sont valides que dans le même processus, les ID sont à l'échelle du système. –

1

Vous pouvez utiliser l'appel GetWindowThreadProcessId WinAPI

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

Pour obtenir le numéro de processus - alors obtenir un objet de processus en utilisant cela .....

Mais pourquoi ne voulez-vous pas énumérer les identifiants des processus en cours?

+0

Celui-là prend une poignée de fenêtre. Il a un handle de processus. Le WINAPI 'GetProcessId' est ce dont il a besoin. – Thorarin

Questions connexes