У меня есть программа (работает как фоновый процесс), в которой я установил крючок для захвата событий EVENT_SYSTEM_FOREGROUND (т. Е. Когда пользователь переключается между окнами). Обратный вызов, который зарегистрирован для крючка, в основном регистрирует, какое приложение (процесс exe filename) пользователь переключил с и который они переключили на.Win32 C++ OpenProceess должен возвращать значение null, если пользователь вышел из приложения, но не так ли?
Я хочу добавить код, чтобы проверить, включено ли приложение, которое они переключали из (если мы не предполагаем, что они его закрыли, и это то, что внесло на передний план новое окно). Я проверяю на это существование, пытаясь создать дескриптор предыдущего PID, используя OpenProcess
//Check prev pid still exists - if not, assume the previous app has been closed
HANDLE hPrevProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,g_prevPid);
if (hPrevProc==NULL){
prevProcStillRunning=false;
}
else{
CloseHandle(hPrevProc);
}
Предположения с указанным кодом:
g_prevPid заселен с PID - Я проверил это
prevProcStillRunning инициализирован to true
Проблема с приведенным выше кодом заключается в том, что по какой-либо причине, даже когда пользователь вышел из приложения (например, notepad.exe). В течение 10 секунд после их выхода этот тест все равно проходит (т.е. - hPrevProc получает инициализацию). Несмотря на то, что в диспетчере задач я вижу, что процесс Notepad.exe распался (и да, у меня только один экземпляр его открыт), так или иначе, строка OpenProcess все равно может получить дескриптор этого PID. Я предполагаю, что как-то PID на самом деле все еще существует, но может быть в состоянии, когда его завершение. Я обнаружил, что если этот код вызывается еще несколько раз, в конце концов он вернет null.
Я хотел бы найти лучший способ проверить, является ли hPrevProc еще активным. Я попытался проверить это, используя функцию GetExitCodeProcess, но это, похоже, просто дает мне PID, и я даже не уверен, что это правильный подход в любом случае.
Любая помощь приветствуется.
Точный момент времени, когда последний дескриптор объекта ядра закрыт и, следовательно, приводит к сбою OpenProcess(), весьма непредсказуем , Типичное зараженное вредоносным ПО, которое программисты, добровольно устанавливающие на своем компьютере, может сохранить его дольше, чем ожидалось. –
Процессы зомби имеют идентификатор, даже если они завершены. Используйте 'WaitForSingleObject' с таймаутом 0, чтобы узнать, завершился ли процесс. –