Что делает функция CloseApplication WIX и как приложение может реагировать на такой сигнал - PullRequest
0 голосов
/ 09 июня 2010

В настройке WIX, которую я получил, при обновлении приложения я установил требование закрывать приложения, которые могут удерживать файлы, которые необходимо обновить:

<util:CloseApplication
    Id="CloseMyApp" 
    Target="[MyAppExe]"
    CloseMessage="yes"
    Description="!(loc.MyAppStillRunning)"
    RebootPrompt="no"
    ElevatedCloseMessage="no"
/>

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

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

Так что вопрос: это может быть возможной проблемой? Если да - как я могу получить это диалоговое окно подтверждения и при этом вести себя правильно, когда установщик просит закрыть приложение? Должен ли я слушать сообщения Win32 (например, WM_QUIT / WM_CLOSE) или есть .NET API, который я могу использовать для правильного ответа на эти события?

Обновление: Согласно списку рассылки , CloseApplication отправит WM_CLOSE приложению. У меня все еще есть проблема с другим поведением, если пользователь закрывает приложение по сравнению с сообщением о закрытии, отправленным WIX. Не уверен, как определить различные источники закрытия приложения.

Ответы [ 2 ]

0 голосов
/ 14 июня 2010

Когда VM_CLOSE отправляется в мое приложение WPF, я получаю, как Джим упоминает событие Closing.В этом закрытии я делаю проверку свойства IsFocused в своем классе Window.Когда возвращается false, я закрываю приложение без подтверждения пользователя.

0 голосов
/ 11 июня 2010

Ваше приложение должно получить WM_CLOSE, который должен отображаться в вашем приложении .NET как событие «Закрытие» в вашей главной форме.При обработке этого вы можете использовать Win32 API GetLastActivePopup , чтобы проверять любые активные диалоговые окна, которые вы открываете, и закрывать их соответствующим образом.

Вы можете проверить свою реализацию, открыв диспетчер задач и выполнив«Конец процесса» в вашем приложении.Сначала попытается выполнить плавное отключение, используя метод, аналогичный тому, что, вероятно, делает WiX.

...