2009-08-14 17 views
8

Czy ktoś może mi powiedzieć, w jaki sposób mogę przechwycić uruchomiony proces w języku C# przy użyciu klasy procesu, jeśli już znam uchwyt?Pobranie procesu z danym uchwytem procesu

Id raczej nie musiał wymieniać metody procesów runrunning. pInvoke jest w porządku, jeśli to możliwe.

Odpowiedz

8

W zwykłym C#, wygląda na to trzeba pętli przez nich wszystkich:

// IntPtr myHandle = ... 
Process myProcess = Process.GetProcesses().Single(
    p => p.Id != 0 && p.Handle == myHandle); 

Powyższy przykład celowo nie powiedzie, jeśli uchwyt nie został znaleziony. W przeciwnym razie możesz oczywiście użyć SingleOrDefault. Wygląda na to, że nie podoba ci się żądanie obsługi identyfikatora procesu 0, stąd dodatkowy warunek.

Za pomocą WINAPI można użyć GetProcessId. Nie mogłem go znaleźć na pinvoke.net, ale powinno to zrobić:

[DllImport("kernel32.dll")] 
static extern int GetProcessId(IntPtr handle); 

(podpis wykorzystuje DWORD, ale identyfikatory procesów są reprezentowane przez int S w .NET BCL)

Wydaje się trochę dziwne, że masz uchwyt, ale nie jest to identyfikator procesu. Uchwyty procesów są pobierane przez wywołanie OpenProcess, które pobiera identyfikator procesu.

+0

Otrzymuję komunikat odmowy dostępu (wyjątek win32)? – Grant

+0

Naprawiono, ale może powinieneś wtedy użyć WINAPI. To właśnie preferowałeś w pierwszej kolejności :) – Thorarin

+1

process.handle daje odmowę dostępu, ale. ** process.MainWindowHandle ** działa bezbłędnie –

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

Wydaje się, że nie ma prostego sposobu na wykonanie tego przez .Net API. Pytanie brzmi: skąd wziąłeś ten uchwyt? Jeśli w ten sam sposób można uzyskać dostęp do procesów ID, można użyć:

Process.GetProcessById (int iD)

+0

Uzyskanie go za pomocą identyfikatora byłoby z pewnością lepsze/łatwiejsze, ale jest możliwe za pomocą uchwytu. Zobacz inne odpowiedzi. – Thorarin

+0

API ujawnia HWND, ale nie identyfikator. – Grant

+0

Pozostaje pytanie, skąd pochodzi uchwyt. Jeśli używany jest interfejs API win32, może być wydane inne wywołanie interfejsu API w celu uzyskania identyfikatora procesu z uchwytu. Inną kwestią jest to, że uchwyty są ważne tylko w tym samym procesie, identyfikatory są systemowe. –

Powiązane problemy