Получить запущенный процесс по заданному дескриптору процесса
Вопрос
может ли кто-нибудь сказать мне, как я могу захватить запущенный процесс в С#, используя класс процесса, если я уже знаю дескриптор?
Я бы предпочел также не перечислять метод getrunningprocesses.pInvoke в порядке, если это возможно.
Решение
На простом C# похоже, что вам придется перебрать их все:
// IntPtr myHandle = ...
Process myProcess = Process.GetProcesses().Single(
p => p.Id != 0 && p.Handle == myHandle);
Приведенный выше пример намеренно терпит неудачу, если дескриптор не найден.В противном случае вы, конечно, могли бы использовать SingleOrDefault
.Видимо, ему не нравится, что вы запрашиваете дескриптор идентификатора процесса. 0
, отсюда и дополнительное условие.
Используя WINAPI, вы можете использовать GetProcessId
.Я не смог найти его на pinvoke.net, но это должно подойти:
[DllImport("kernel32.dll")]
static extern int GetProcessId(IntPtr handle);
(в подписи используется DWORD
, но идентификаторы процессов представлены int
s в .NET BCL)
Однако кажется немного странным, что у вас есть дескриптор, но не идентификатор процесса.Дескрипторы процесса получаются путем вызова OpenProcess
, который принимает идентификатор процесса.
Другие советы
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;
}
}
Кажется, не существует простого способа сделать это с помощью .Net API.Вопрос в том, откуда у вас эта ручка?Если таким же образом вы можете получить доступ к идентификатору процессов, вы можете использовать:
Process.GetProcessById (int iD)
Вы можете использовать вызов WinAPI GetWindowThreadProcessId.
http://www.pinvoke.net/default.aspx/user32/GetWindowThreadProcessId.html
Чтобы получить идентификатор процесса, затем получите объект процесса, используя его.....
Но почему вы не хотите перечислять идентификаторы запущенных процессов?