У меня есть массив, полный обработчиков процессов, и теперь я пытаюсь получить соответствующие идентификаторы процессов для каждого из них.GetProcessId возвращает нуль
Однако все мои идентификаторы процесса возвращаются как ноль. Любой, кто может указать, какую очевидную проблему мне не хватает?
Большое спасибо
Массив 'ребенок' заполняется процесс идентификаторам таким образом:
currChild = FindWindowEx(hParent, prevChild, null, null);
Тогда я пытаюсь получить идентификатор процесса:
for (int i = 0; i < children.Count; ++i)
{
handle = children[i];
pid = GetProcessId(handle);
Console.WriteLine(children[i].ToString("X") + " : " + pid.ToString());
API:
[DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("kernel32.dll", EntryPoint = "GetProcessId", CharSet = CharSet.Auto)]
static extern int GetProcessId(IntPtr handle);
Out говоря:
2417E2 : 0
B20D9A : 0
48108C : 0
8809D6 : 0
B5140E : 0
4207F6 : 0
4213B0 : 0
5D15DA : 0
etc ....
У вашей программы достаточно прав? попробуйте запустить его с административными привилегиями – Ivan
Что такое 'handle'? Что такое 'дети'? – Marton
Проверка ошибок никогда не является обязательной, если вы используете pinvoke, у вас нет дружественных исключений .NET, чтобы вы не попадали в неприятности. GetProcessId() указывает на отказ, возвращая 0. Исправьте ваши объявления pinvoke и добавьте SetLastError = true. И бросайте Win32Exception, когда вы получаете индикацию отказа. Обнаружение ошибки в вашей программе теперь становится легким. –