2009-08-14 126 views

回答

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,但進程ID由.NET BCL int小號代表)

這似乎是一個有點奇怪,你有一個句柄,但不是一個進程ID。通過調用OpenProcess來獲取進程句柄,該進程句柄需要一個進程ID。

+0

我得到一個訪問被拒絕的消息(win32異常)? – Grant 2009-08-14 08:23:50

+0

已修復,但也許您應該使用WINAPI。這是你首選的東西:) – Thorarin 2009-08-14 08:41:16

+1

process.handle給予訪問被拒絕,但。 ** process.MainWindowHandle **無誤運行 – 2015-09-29 12:00:16

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

似乎沒有簡單的方法來通過.Net API來做到這一點。問題是,你從哪裏得到這個處理?如果以同樣的方式,你可以訪問該進程的ID,你可以使用:

Process.GetProcessById (int iD)

+0

通過ID獲取它肯定會更好/更容易,但可以通過處理。查看其他答案。 – Thorarin 2009-08-14 08:23:32

+0

API公開了HWND,但沒有ID – Grant 2009-08-14 08:24:46

+0

問題仍然存在,處理來自何處。如果使用win32 API,則可能會發出另一個API調用來獲取句柄中的進程ID。 另一個問題是,句柄只在同一個進程中有效,ID是系統範圍 – 2009-08-14 08:28:32

相關問題