質問

次の方法を使用しています

    [DllImport("kernel32.dll", SetLastError=true)]
    static extern int GetProcessId(IntPtr hWnd);

実行中のプロセスのためにProcessIDを取得しようとすると、私が持っている唯一の情報はHWNDです。私の問題は、ERROR_INVALID_HANDLEであるエラーコード6を常に返していることです。私はパラメーターをタイプINTのように変更するかもしれないと思ったが、それも機能しなかった。一度に実行されているインスタンスが1つ以上ある可能性があるため、実行中のプロセスを列挙することはできません。

誰かが私が何か問題を抱えているかどうかを見ることができますか?

NB:このプロセスは、フレームワークにさらされた自動化オブジェクトから生成され、HWNDプロパティのみを提供します。おそらく、私が書いたコードがそもそもそれを実行する責任があるので、ProcessIDを見る別の方法がありますか?

私のコードはこれに似たものに見えます...

AutomationApplication.Application ExtApp = new AutomationApplication.Application(); extapp.run(); ...

役に立ちましたか?

解決

「AutomationApplication.Application」クラスとは何ですか?あなたはそれを書きましたか? .run()はpidを返しますか?

他のヒント

getProcessid ウィンドウハンドルではなく、プロセスハンドルが与えられたときにプロセスIDを取得します。それは実際です:

[DllImport("kernel32", SetLastError = true)]
static extern int GetProcessId(IntPtr hProcess);

ウィンドウハンドルがある場合は、 getWindowThreadProcessid 関数:

[DllImport("user32")]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int processId);

これにより、スレッドIDが返され、プロセスIDがOut-Paramに配置されます。

を参照してください Pinvokeの例, 、必要ありません WIN32 マネージドAPIを使用できるため、電話してください。

代替マネージドAPI:System.Diagnostics.Processクラスには、多くのモジュール、プロセス、およびスレッドメソッドが含まれています。

例えば:

using System.Diagnostics;
...
private void DumpModuleInfo(IntPtr hProcess)
{
    uint pid = GetProcessId(hProcess);
    foreach (Process proc in Process.GetProcesses())
    {
        if (proc.Id == pid)
        {
            foreach (ProcessModule pm in proc.Modules)
            {
                Console.WriteLine("{0:X8} {1:X8} {2:X8} {3}", (int)pm.BaseAddress,
                (int)pm.EntryPointAddress, (int)pm.BaseAddress + pm.ModuleMemorySize, pm.ModuleName);
            }
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top