Более добрый путь, чем TerminateProcess? - PullRequest
7 голосов
/ 18 июня 2011

У меня есть приложение для резервного копирования, которое закрывает пользовательские запущенные программы перед резервным копированием, чтобы открытые файлы данных можно было закрыть и очистить перед резервным копированием.После завершения резервного копирования он перезапускает программы из списка.

У меня нет проблем с получением дескриптора окна, используя Caption и PostMessage (AppHandle, WM_CLOSE, 0,0);Это прекрасно работает для большинства приложений, но не для тех, которые работают в области уведомлений (системный трей)

В настоящее время я использую TerminateProcess (и он работает для этих приложений в области уведомлений, но оставляет файлы открытыми, так как Windows обходит любыеЗакрыть инструкции и только хлопают эти приложения вниз.

1006 * Я искал долго и трудно, и я не могу найти более хороший способ закрыть приложения области уведомлений. может кто-нибудь пожалуйста помочь? 1008 * Спасибо

Ответы [ 2 ]

8 голосов
/ 18 июня 2011

Чтобы корректно закрыть программу, вам нужно знать кое-что о том, как эта программа будет закрыта. Если закрытие главного окна завершается, вам нужно знать, как распознать «главное» окно.

Программы не запускаются "в" области уведомлений. Там отображаются значки. Любая программа со значком уведомления также должна иметь окно (поскольку оболочка сообщает программе, что значок был нажат, отправляя сообщения в окно). Даже если окно не видно, оно все равно должно существовать. Если вы можете определить некоторый набор свойств, которые идентифицируют окно, связанное с определенным значком уведомления, то вы можете закрыть его. Тем не менее, нет стандартного набора атрибутов для поиска; каждая программа может делать это по-своему.

И даже если вы найдете нужное окно, его закрытие может не соответствовать ожидаемой программе. Вместо этого может потребоваться определенная команда из меню значка уведомления или какое-либо сообщение, отправленное диалоговым окном, отображаемым программой.

2 голосов
/ 18 июня 2011

Если ваше приложение работает в Windows Vista или Windows 7, не закрывайте программы - вместо этого используйте службу Volume Shadow Copy , чтобы получить доступ к снимку файлов, пока они еще используются.Это то, что делает встроенная программа резервного копирования Windows 7.

Если вы используете более раннюю версию Windows, не существует надежного решения.Если в программе есть значок системного окна, у нее также будет скрытое окно, и вы можете попробовать отправить ей WM_QUERYENDSESSION и WM_ENDSESSION .Тем не менее, нет гарантии, что программа будет закрыта, и если она все-таки закроется, так как вы можете обойти части ее обычного процесса выключения, она может не завершить свою обычную очистку.Также могут быть программы, работающие без связанных окон вообще.Лучшим подходом, вероятно, было бы просто выйти из системы и выполнить резервное копирование из процесса обслуживания.Конечно, у вас все еще будут проблемы с файлами, открытыми другими службами ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...