2014-11-18 6 views
0

배열이 프로세스 처리로 가득 차서 각각의 관련 프로세스 ID를 얻으려고합니다.0을 반환하는 GetProcessId

그러나 모든 프로세스 ID는 0으로 되돌아갑니다. 내가 놓친 명백한 문제를 지적 할 수있는 사람은 누구입니까?

많은 감사

'아이 배열은 공정 ID를 이렇게 채워집니다 :

for (int i = 0; i < children.Count; ++i) 
{ 
     handle = children[i]; 
     pid = GetProcessId(handle); 
     Console.WriteLine(children[i].ToString("X") + " : " + pid.ToString()); 

의 API :

currChild = FindWindowEx(hParent, prevChild, null, null); 

가 그럼 난 프로세스 ID를 얻으려고

[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); 

넣어 : GetProcessId 입력으로 후자를 들어 과정 핸들이 아닌 창 핸들 을 받아

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

하는 것으로 대신 GetWindowThreadProcessId를 사용할 수 있습니다.

GetWindowThreadProcessId

+1

Marton, 당신은 절대적으로 맞습니다. 불충분 한 오류. 어쩌면 휴식을 취하고 커피를 마시고 눈알을 문지 르면 도움이 될 것입니다. 답변 해 주셔서 감사합니다. – Esby

+1

@ user3379697 예, 때로는 올바른 해결책은 30 분 정도 낮잠을 잘 때리는 것입니다. – Marton