Следует помнить, что процессы и программы - или, по крайней мере, то, что пользователь считает программой - не обязательно одно и то же.
Если вы используете PSAPI для получения списка всехзапущенные процессы, вы увидите много фоновых процессов, которые вообще не соответствуют открытым окнам.Также есть случаи, когда один процесс может иметь несколько открытых окон верхнего уровня.Таким образом, в то время как у вас есть простые случаи, такие как блокнот, где однажды процесс notepad.exe соответствует одному окну Блокнота, у вас также есть случаи, такие как:
- Word, где один текстовый процесс обрабатывает все текстовые документы, открытые в данный момент (одинпроцесс, много окон)
- Проводник, в котором один процесс exploere.exe обрабатывает все открытые окна проводника, а также такие вещи, как окна панели управления и панель задач.
- Chrome (и другие браузеры), где каждая вкладка получает свой собственный процесс (много процессов, одно окно!)
Использование TerminateProcess, возможно, не лучший способ закрыть приложение: это не является прямым эквивалентом нажатия кнопки закрытия.Он принудительно завершает весь процесс тут же, не давая ему никакой возможности очиститься.Если вы сделаете это в Word, то при перезапуске он перейдет в «режим восстановления» и будет действовать так, как если бы он не отключился в последний раз.Лучше оставить последнее средство, если процесс перестал отвечать.Кроме того, если вы TerminateProcess в процессе, таком как Word или Explorer, вы в конечном итоге закроете все окна, принадлежащие этому процессу, а не только одно конкретное.
Учитывая все это, еслипо сути, вы хотите написать какой-то менеджер программ, вам лучше использовать подход, ориентированный на окна, а не процесс.Вместо того, чтобы отслеживать запущенные процессы, следите за окнами приложений верхнего уровня.
Есть несколько способов прослушать изменения окон;SetWinEventHook с EVENT_CREATE / DESTROY - это один из способов прослушивания создаваемых или уничтожаемых HWND (вам необходимо выполнить фильтрацию здесь, так как он расскажет вам обо всех HWND - и не только!), Но вы заботитесь только о высокоуровневых итолько приложение в этом).SetWindowsHookEx может иметь другие параметры, которые могут работать здесь (WH_CBT).Вы также можете использовать EnumWindows для вывода списка текущих окон (опять же, вам нужно отфильтровать собственные диалоги и всплывающие подсказки, невидимые в настоящее время HWND и т. Д.).
При наличии HWND вы можете получить информацию о процессе, если это необходимо.с помощью GetWindowThreadProcessId.
Чтобы закрыть окно, лучше всего сначала попробовать отправить WM_SYSCOMMAND / SC_CLOSE: это ближе к нажатию кнопки закрытия и дает приложению возможность очистить.Обратите внимание, что в некоторых приложениях отображается сообщение «Вы уверены, что хотите закрыть?»диалоговое окно, если вы не сохранили его недавно - опять же, это соответствует нажатию кнопки закрытия мышью.