誰かが、すでにハンドルを知っていれば、プロセスクラスを使ってC#で実行中のプロセスをキャプチャする方法を教えてくれますか?与えられたプロセスハンドルを取得するプロセスを取得する
Idではなく、getrunning processesメソッドを列挙する必要はありません。可能であればpInvokeはOKです。無地のC#で
誰かが、すでにハンドルを知っていれば、プロセスクラスを使ってC#で実行中のプロセスをキャプチャする方法を教えてくれますか?与えられたプロセスハンドルを取得するプロセスを取得する
Idではなく、getrunning processesメソッドを列挙する必要はありません。可能であればpInvokeはOKです。無地のC#で
は、それはあなたがそれらすべてをループするために持っているように見えます:
ハンドルが見つからない場合は、上記の例は、意図的に失敗した// 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
を呼び出して取得します。
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;
}
}
.Net APIによってこれを行う簡単な方法はないようです。問題は、あなたがそのハンドルをどこから得たかです。同じ方法であなたはプロセスのIDへのアクセスを得ることができた場合は、使用できます。
Process.GetProcessById (int iD)
あなたはGetWindowThreadProcessId WinAPIのコール
http://www.pinvoke.net/default.aspx/user32/GetWindowThreadProcessId.html
を使用することができプロセスIDを取得するには - そして、 .....を使用してProcessオブジェクトを取得します。
しかし、実行中のプロセスのIDを列挙したいのはなぜですか?
それはウィンドウハンドルを取ります。彼はプロセスハンドルを持っています。 WINAPIの 'GetProcessId'が必要です。 – Thorarin
アクセス拒否メッセージ(win32例外)が表示されますか? – Grant
固定されていますが、その代わりにWINAPIを使用してください。それはあなたが最初に好むものです:) – Thorarin
process.handleは拒否されたアクセスを与えます。 ** process.MainWindowHandle **はエラーフリーで動作します –