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.
Otrzymuję komunikat odmowy dostępu (wyjątek win32)? – Grant
Naprawiono, ale może powinieneś wtedy użyć WINAPI. To właśnie preferowałeś w pierwszej kolejności :) – Thorarin
process.handle daje odmowę dostępu, ale. ** process.MainWindowHandle ** działa bezbłędnie –