2

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

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

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

私が何か間違ったことをしているかどうか、誰でも見ることができますか?

注意: プロセスは、フレームワークに公開されたオートメーション オブジェクトから生成され、HWND プロパティのみを提供します。おそらく、私が書いたコードが最初にそれを実行する責任を負っていたので、processID を取得する別の方法があるでしょうか?

私のコードはこれに似ています...

AutomationApplication.Application extApp = new AutomationApplication.Application(); extApp.Run(); ...

4

3 に答える 3

11

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 に入れます。

于 2009-08-16T06:56:24.860 に答える
1

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

于 2009-08-16T06:04:17.090 に答える
0

マネージ API を使用できるため、呼び出しの必要がないPinvokeの例を参照してください。WIN32

代替マネージ 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);
            }
        }
    }
}
于 2009-08-16T06:50:39.023 に答える