Получить запущенный процесс по заданному дескриптору процесса

StackOverflow https://stackoverflow.com/questions/1276629

  •  16-09-2019
  •  | 
  •  

Вопрос

может ли кто-нибудь сказать мне, как я могу захватить запущенный процесс в С#, используя класс процесса, если я уже знаю дескриптор?

Я бы предпочел также не перечислять метод 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, но идентификаторы процессов представлены ints в .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

Чтобы получить идентификатор процесса, затем получите объект процесса, используя его.....

Но почему вы не хотите перечислять идентификаторы запущенных процессов?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top