2009-08-14 18 views

答えて

8

は、それはあなたがそれらすべてをループするために持っているように見えます:

ハンドルが見つからない場合は、上記の例は、意図的に失敗した
// IntPtr myHandle = ... 
Process myProcess = Process.GetProcesses().Single(
    p => p.Id != 0 && p.Handle == myHandle); 

。それ以外の場合は、もちろんSingleOrDefaultを使用することもできます。どうやら、それはプロセスID 0のハンドルを要求することを好みません。したがって、余分な条件があります。

WINAPIを使用すると、GetProcessIdを使用できます。それはそう

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

(署名がDWORD使用していますが、プロセスIDは、.NET BCLでint秒で表されます)

:私はpinvoke.netでそれを見つけることができませんでしたが、これは行う必要がありますあなたがハンドルを持っているが、プロセスIDではないということは奇妙である。プロセスハンドルは、プロセスIDを取得する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

.Net APIによってこれを行う簡単な方法はないようです。問題は、あなたがそのハンドルをどこから得たかです。同じ方法であなたはプロセスのIDへのアクセスを得ることができた場合は、使用できます。

Process.GetProcessById (int iD)

+0

IDで取得する方が確かに優れていますが、それはハンドルで可能です。他の答えを見てください。 – Thorarin

+0

APIがHWNDを公開しますが、IDは表示されません – Grant

+0

ハンドルがどこから来るのかという疑問は残っています。 win32 APIが使用されている場合、ハンドルからプロセスIDを取得するために別のAPI呼び出しを発行する必要があります。 もう1つの問題は、同じプロセス内でのみハンドルが有効で、IDがシステム全体であるということです –

1

あなたはGetWindowThreadProcessId WinAPIのコール

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

を使用することができプロセスIDを取得するには - そして、 .....を使用してProcessオブジェクトを取得します。

しかし、実行中のプロセスのIDを列挙したいのはなぜですか?

+0

それはウィンドウハンドルを取ります。彼はプロセスハンドルを持っています。 WINAPIの 'GetProcessId'が必要です。 – Thorarin

関連する問題