Этот код не может работать. Если внешний процесс остановлен, то OpenProcess
не будет работать, потому что процесс завершился, и PID больше недействителен. И вы не проверяете значение, возвращаемое OpenProcess
. Или PID был повторно использован, и тогда у вас будет обращение к неправильному процессу.
Чтобы безопасно использовать WaitForSingleObject
, вам необходимо получить ручку процесса и повесить на нее. Вызовите OpenProcess
один раз, а затем используйте этот дескриптор для всех последующих вызовов до WaitForSingleObject
. Вызовите CloseHandle
только тогда, когда вы закончите работу с этим процессом.
Однако ваше использование WaitForSingleObject
просто не будет полезно для обнаружения того, что программа не отвечает. В этом случае вызов OpenProcess
будет успешным, так как процесс все еще существует и работает. Вызов WaitForSingleObject
возвращает WAIT_TIMEOUT
, так как процесс все еще запущен. В конце концов, повисший процесс все еще работает.
Таким образом, вся внутренность вашего кода неверна. Висящее окно (или даже любое окно) может существовать только в запущенном процессе! Вам нужно будет выбросить код, который у вас есть, и вместо этого просто вызвать IsHungAppWindow
. Вам понадобится дескриптор окна для главного окна приложений.
Спасибо, я проверил IsHungAppWindow. Я новичок в C++, поэтому я должен спросить. Как я могу получить Hwnd из другого приложения? –
http://stackoverflow.com/questions/1888863/how-to-get-main-window-handle-from-processid –