В простом языке C#, это выглядит, как вы должны перебрать их все:
// IntPtr myHandle = ...
Process myProcess = Process.GetProcesses().Single(
p => p.Id != 0 && p.Handle == myHandle);
Приведенный выше пример намеренно завершается неудачей, если дескриптор не найден. В противном случае вы могли бы, конечно, использовать SingleOrDefault
. По-видимому, вам не нравится запрашивать дескриптор процесса ID 0
, поэтому дополнительное условие.
Используя WINAPI, вы можете использовать GetProcessId
. Я не мог найти его на Pinvoke.net, но это нужно сделать:
[DllImport("kernel32.dll")]
static extern int GetProcessId(IntPtr handle);
(подпись использует DWORD
, но идентификаторы процесса представлены int
с в .NET BCL)
Это кажется бит, если у вас есть дескриптор, но не идентификатор процесса. Обработчики процессов получают путем вызова OpenProcess
, который принимает идентификатор процесса.
Я получаю сообщение об отказе в доступе (исключение win32)? – Grant
Исправлено, но, возможно, вместо этого вы должны использовать WINAPI. Это то, что вы предпочли в первую очередь :) – Thorarin
process.handle дает доступ отрицательно, но. ** process.MainWindowHandle ** работает ошибка –