Вопрос

Я использую следующий метод

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

Чтобы попытаться получить ProcessID для выполнения процесса, и единственная информация, которая у меня есть, - это HWND. Моя проблема в том, что он всегда возвращает код ошибки 6, который является ошибкой_инвалид_андле. Я думал, что могу изменить параметр на тип Int, но это также не сработало. Я не могу перечислять процессы работы, потому что может быть более 1 экземпляра, работающего за один раз.

Кто -нибудь может увидеть, делаю ли я что -нибудь не так?

NB: Процесс порожден от объекта автоматизации, подвергнутого, и предоставляет только свойство HWND. Возможно, есть еще один способ получить ProcessID, поскольку код, который я написал, был ответственен за его запуск?

Мой код выглядит нечто похожее на это ...

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

Это было полезно?

Решение

Что такое класс «AutomationApplication.Application»? Вы это написали? Верно ли .run () возвращает пид?

Другие советы

GetProcessId Получает идентификатор процесса при предоставлении рукоятки процесса, а не ручка окон. Это на самом деле:

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

Если у вас есть ручка окон, то вы хотите GetWindowThreadProcessId Функция:

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

Это возвращает идентификатор потока и помещает идентификатор процесса в абит-параме.

Увидеть Пример на Pinvoke, нет необходимости в WIN32 звоните, как вы можете использовать управляемый API:

Альтернативный управляемый API: System.diagnostics.process Class содержит множество методов модуля, процесса и потока.

Например:

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