Erhalten Sie einen laufenden Prozess gegebenen Prozessgriff
Frage
Kann mir jemand sagen, wie ich einen Laufprozess in C# mit der Prozessklasse erfassen kann, wenn ich das Griff bereits kenne?
Ich musste die Methode von GetRunning Process -Methoden eher nicht aufzählen. Pinvoke ist wenn möglich in Ordnung.
Lösung
In Plain C#sieht es so aus, als müssten Sie sie alle durchlaufen:
// IntPtr myHandle = ...
Process myProcess = Process.GetProcesses().Single(
p => p.Id != 0 && p.Handle == myHandle);
Das obige Beispiel scheitert absichtlich, wenn der Griff nicht gefunden wird. Andernfalls könnten Sie natürlich verwenden SingleOrDefault
. Anscheinend mag es nicht, dass Sie das Handwerk von Prozess -ID anfordern 0
, daher der zusätzliche Zustand.
Mit dem WinAPi können Sie verwenden GetProcessId
. Ich konnte es nicht auf Pinvoke.net finden, aber das sollte es tun:
[DllImport("kernel32.dll")]
static extern int GetProcessId(IntPtr handle);
(Signatur verwendet a DWORD
, aber Prozess -IDs werden durch dargestellt int
s in der .NET BCL)
Es scheint ein bisschen seltsam, dass Sie einen Griff haben würden, aber keine Prozess -ID. Prozessgriffe werden durch Anrufe erworben OpenProcess
, was eine Prozess -ID nimmt.
Andere Tipps
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;
}
}
Es scheint keine einfache Möglichkeit zu geben, dies von der .NET -API zu tun. Die Frage ist, woher du diesen Griff hast? Wenn Sie auf die gleiche Weise Zugriff auf die Prozess -ID erhalten, können Sie verwenden:
Process.GetProcessById (int iD)
Sie können den GetWindowThreadProcessid WinAPi -Anruf verwenden
http://www.pinvoke.net/default.aspx/user32/getwindowthreadprocessid.html
Um die Prozess -ID zu erhalten, erhalten Sie ein Prozessobjekt mit diesem .....
Aber warum möchten Sie die IDs der laufenden Prozesse nicht aufzählen?