2014-11-18 3 views
0

У меня есть массив, полный обработчиков процессов, и теперь я пытаюсь получить соответствующие идентификаторы процессов для каждого из них.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 .... 
+0

У вашей программы достаточно прав? попробуйте запустить его с административными привилегиями – Ivan

+0

Что такое 'handle'? Что такое 'дети'? – Marton

+2

Проверка ошибок никогда не является обязательной, если вы используете pinvoke, у вас нет дружественных исключений .NET, чтобы вы не попадали в неприятности. GetProcessId() указывает на отказ, возвращая 0. Исправьте ваши объявления pinvoke и добавьте SetLastError = true. И бросайте Win32Exception, когда вы получаете индикацию отказа. Обнаружение ошибки в вашей программе теперь становится легким. –

ответ

5

Обратите внимание, что GetProcessId принимает в качестве входного процесса ручку, не окна ручки Для последнего, вы можете использовать вместо GetWindowThreadProcessId.

GetWindowThreadProcessId

+1

Мартон, ты совершенно прав. Какая хромая ошибка. Может быть, перерыв, кофе и протрите мои глазные яблоки. Спасибо за ваш ответ. – Esby

+1

@ user3379697 Да, иногда правильное решение - всего лишь 30 минут. – Marton

Смежные вопросы