Как закрыть приложение без отображения модального диалогового окна? - PullRequest
4 голосов
/ 25 ноября 2011

У меня есть приложение, которое может открывать PDF-файлы после их создания. Если два отчета генерируются последовательно с одним и тем же именем, вторая попытка завершается неудачно, если в первой копии acrobat PDF-файл все еще открыт, поэтому перед тем, как написать PDF-файл, я проверяю (с помощью FindWindow) окно с именем документа. Если он найден, я выдаю SendMessage WM_Close.

Это работает нормально, но я проводил некоторые другие тесты и использовал Word, чтобы «редактировать» PDF, чтобы держать его открытым, чтобы я мог проверить поведение приложения, когда оно не может записать файл PDF. Теперь, когда мое приложение пытается закрыть окно, в Word появляется диалоговое окно «Хотите сохранить». Если я нажму кнопку «Отмена», Word останется открытым, мое приложение продолжит работу, и я могу проверить, что оно ведет себя разумно, когда обнаруживает файл, в который не может записать.

Все хорошо, но это предупредило меня о том, что использование SendMessage WM_CLOSE для закрытия другого приложения вызовет мое приложение, если другое приложение вызовет модальный диалог. Есть ли способ обойти это - то есть более сильный (но не слишком сильный) способ закрыть другое приложение? Или «Закрыть и нажать« Отмена »при необходимости». Или я должен использовать асинхронные сообщения?

Ответы [ 3 ]

7 голосов
/ 25 ноября 2011

Не заставляйте закрывать любое приложение, могут быть другие документы, открытые пользователем, просматривающим и т. Д. ... Вы можете использовать SendMessageTimeout, чтобы дождаться возврата WM_CLOSE разумного количества времени , а затем продолжить с ошибкой или успехом ..

var
  Word: HWND;
  msgResult: DWORD;
begin
  ...

  SendMessageTimeout(Word, WM_CLOSE, 0, 0, SMTO_NORMAL, 5000, msgResult);
  if IsWindow(Word) then begin
    // bummer! Application is open...
 
4 голосов
/ 25 ноября 2011

Я бы вообще не закрывал другое приложение. Я думаю, что лучше удалить текущий файл перед генерацией отчета. Если это не удается (DeleteFile), покажите пользователю сообщение о том, что файл не может быть перезаписан (потому что он открыт другой программой), и вообще не создавайте отчет. Это намного безопаснее, потому что вы оставляете эту опцию пользователю. Также это избавляет вас от головной боли, что если программа открывается другой программой, которая не показывает заголовок в заголовке окна?

2 голосов
/ 25 ноября 2011

Если вы хотите пойти дальше, чем WM_CLOSE, вы можете только закрыть приложение.Все остальное будет похоже на лотерею.

Это говорит о том, что я против обоих.Что, если ваш PDF открывается в приложении MDI, в котором уже отображаются другие документы?Принудительное закрытие приложения приведет к тому, что пользователь потеряет все изменения в других открытых документах.И отправка сообщения закрытия в это приложение было бы раздражающим, так как пользователю все еще нужны другие открытые документы.

Вы не можете предсказать поведение каждого приложения.И вы, конечно, не знаете каждое приложение.Если отчет имеет то же имя, вы можете указать пользователю закрыть другой с тем же именем.В противном случае он не получит новый отчет.Подумайте, что произойдет, если Windows начнет закрывать ваши приложения, как только вы попытаетесь перезаписать файл, который используется в данный момент.

...