2009-08-14 4 views
8

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

Идентификатор, скорее всего, не должен также перечислить метод getrunning. pInvoke нормально, если это возможно.

ответ

8

В простом языке 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, который принимает идентификатор процесса.

+0

Я получаю сообщение об отказе в доступе (исключение win32)? – Grant

+0

Исправлено, но, возможно, вместо этого вы должны использовать WINAPI. Это то, что вы предпочли в первую очередь :) – Thorarin

+1

process.handle дает доступ отрицательно, но. ** process.MainWindowHandle ** работает ошибка –

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

Существует, по-видимому, простой способ сделать это с помощью API .Net. Вопрос в том, откуда вы взяли эту ручку? Если таким же образом, вы можете получить доступ к процессам ID, вы можете использовать:

Process.GetProcessById (int iD)

+0

Получение этого идентификатора, безусловно, будет лучше/проще, но это возможно с помощью ручки. См. Другие ответы. – Thorarin

+0

API предоставляет HWND, но не ID – Grant

+0

Остается вопрос, откуда приходит ручка. Если используется API-интерфейс win32, может быть выдан другой вызов API для получения идентификатора процесса из дескриптора. Другая проблема заключается в том, что дескрипторы действительны только в одном и том же процессе, идентификаторы являются системными. –

1

Вы можете использовать вызов GetWindowThreadProcessId WinAPI

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

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

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

+0

Это делает дескриптор окна. У него есть дескриптор процесса. WINAPI 'GetProcessId' - это то, что ему нужно. – Thorarin

Смежные вопросы