Почему GetWindowThreadProcessId несколько раз возвращает 0?

Я внедряю .NET SpyLib в целевое адресное пространство с помощью удаленного вызова. Мне нужно отправить сообщение в поток этого окна, который создал этот удаленный процесс через GetWindowThreadProcessId.

Я работаю над Windows 7. К сожалению, большую часть времени он возвращает 0. Иногда он дает соответствующий идентификатор потока (после перезапуска Windows).

Почему у меня такое странное поведение с GetWindowThreadProcessId?


person Usman    schedule 29.04.2011    source источник
comment
См. раздел «Содержимое сообщества» на этой странице: msdn. .microsoft.com/en-us/library/ms633522%28v=vs.85%29.aspx. GetWindowThreadProcessId возвращает 0, если параметр HWND недействителен. Кроме того, каково значение GetLastError() в этом случае?   -  person Christian.K    schedule 29.04.2011
comment
GetLastError() возвращает 1400 = invlid hWnd. Но, опять же, суть в том, как определить, что это будет invlid hWnd id? поскольку он дает правильное числовое значение.   -  person Usman    schedule 29.04.2011


Ответы (1)


В документации MSDN для GetWindowThreadProcessId есть Раздел «Контент сообщества», в котором DDeBen уже ответил на ваши вопросы за два года до того, как вы даже задали свой вопрос. :)

GetWindowThreadProcessId возвращает 0, и переменная, на которую указывает lpdwProcessId, не изменяется, если дескриптор hWnd недействителен. GetLastError() возвращает 87 (ERROR_INVALID_PARAMETER).

В будущем может помочь помнить, что GetLastError() часто является функцией, к которой вам нужно обращаться в Win32 API, когда у вас есть состояния сбоя, в которых вы не уверены. MSDN обычно дает ссылку на него, но даже если это не так, проверить это не помешает. Однако имейте в виду, что в управляемом коде GetLastError() требуется специальное обращение, иначе вы получите фиктивные результаты, которые в конечном итоге только запутают вас.

person Stigma    schedule 29.04.2011
comment
Несмотря на то, что это действительный числовой идентификатор того процесса, к которому я хочу подключиться, но каждый раз он отличается, скажем, 1028,1439.. Так что для меня это действительные идентификаторы для того процесса, для которого вызывается GetWndowThreadProcessId. Моя точка зрения заключается в том, как проверить, является ли это действительным идентификатором (действительным hWnd), поскольку в моем случае он всегда дает какое-то числовое значение. - person Usman; 29.04.2011
comment
Разделы комментариев сообщества теперь часто отсутствуют, как на этой странице, или, по крайней мере, не там, где они обычно были. Его сейчас нет на странице. - person Celess; 08.04.2017