EnumWindows перечисляет все окна верхнего уровня в процессе. GetWindowThreadProcessId получает процесс и идентификатор каждого потока.
Теперь у вас достаточно информации, чтобы изящно закрыть любое приложение с графическим интерфейсом.
Вы можете отправлять WM_CLOSE
сообщений в любое окно, которое хотите закрыть. Многие окна обрабатывают WM_CLOSE
, чтобы предложить пользователю сохранить документы. Вы можете отправить сообщение WM_QUIT
, используя PostThreadMessage
, в обнаруженные потоки, чтобы завершить цикл обработки сообщений.
Пользовательский код не может вызывать DestroyWindow
из другого приложения или потока в Windows ... если приложение не отвечает на WM_CLOSE
или WM_QUIT
запросы, вы вернулись в TerminateProcess
land.
Это не приведет к закрытию консольных приложений, поскольку процесс приложения и процесс, которому принадлежит окно, отличаются.
Нет реального способа изящного закрытия консольных приложений в Windows. Они должны поддерживать какой-то изящный механизм закрытия.