Невозможно извлечь ProcessID из getProcessId (.. hwnd) (Pinvoke)
-
16-09-2019 - |
Вопрос
Я использую следующий метод
[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);
}
}
}
}