У меня в программе в определенное время срабатывает таймер, который вызывает Application->MainForm->Close();
Всё бы ничего, но есть ситуации когда программе нельзя закрываться, например, когда отображается сообщение вызванное через MessageBox(...).
Возникает вопрос, как определить, есть ли открытое окно MessageBox(...) или нет?
Вы описываете какую-то странную и противоречивую бизнес-логику. Трудно сказать, что вы хотите на самом деле, но выглядит примерно так: "Если пользователь бросил программу и ушёл на восемь часов, она должна закрыться. Но если он бросил её в тот момент, когда программа показала сообщение "ОК", она так и должна висеть".
Думаю, Вам стоит сформулировать общую задачу — тогда станет понятно и оптимальное решение. Пока могу заметить, что в программах с подобным функционалом обычно пользуются диалоговыми окнами, автоматически закрывающими себя через какое-то время. Ну и пользоваться MessageBox — довольно странная прихоть, из которой всё и растёт, при использовании обычного MessageDlg не было бы никаких проблем.
Здравствуйте, Alex.Che, Вы писали: AC>GetActiveWindow() + GetClassName()
Попробуйте вызвать GetActiveWindow() в тот момент, когда программа неактивна, допустим пользуетесь другой программой, в этом случае GetActiveWindow() вернет 0.
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, lsv, Вы писали:
S>Вы описываете какую-то странную и противоречивую бизнес-логику. Трудно сказать, что вы хотите на самом деле, но выглядит примерно так: "Если пользователь бросил программу и ушёл на восемь часов, она должна закрыться. Но если он бросил её в тот момент, когда программа показала сообщение "ОК", она так и должна висеть".
S>Думаю, Вам стоит сформулировать общую задачу — тогда станет понятно и оптимальное решение. Пока могу заметить, что в программах с подобным функционалом обычно пользуются диалоговыми окнами, автоматически закрывающими себя через какое-то время. Ну и пользоваться MessageBox — довольно странная прихоть, из которой всё и растёт, при использовании обычного MessageDlg не было бы никаких проблем.
Вы всё верно угадали, пользователи на терминале не закрывают программы, ровно в полночь все программы должны закрыться, но иногда бывают случаи, когда они оставляют программы прям с сообщением "Сохранить документ? Да. Нет.", если в такой ситуации закрыть принудительно программу, то поимеем сотрудника, который вынесет всем мозг, а вот если не закроем, то теперь уже мы имеем право попинать данного сотрудника.
Уйти от MessageBox'ов нельзя.
Вот и появился вопрос, как прочекать, наличие открытого MessageBox'а.
Здравствуйте, Alex.Che, Вы писали: >> Возможно я задам глупый вопрос ... а как? AC>что именно? уточни в чем у тебя затык.
Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком.
Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?
> Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком. > Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?
ууу... как всё запущено...
боюсь что не смогу тебе помочь, уж не обессудь
Здравствуйте, lsv, Вы писали:
lsv>Здравствуйте, Alex.Che, Вы писали: >>> Возможно я задам глупый вопрос ... а как? AC>>что именно? уточни в чем у тебя затык.
lsv>Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком. lsv>Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?
Думаю тебе хватит проверить не задизейблино ли основное окно IsWindowEnabled.
Что-то типа
if not IsWindowEnabled(Application.MainForm.Handle) then// message box active
Здравствуйте, Danchik, Вы писали:
lsv>>Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком. lsv>>Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?
D>Думаю тебе хватит проверить не задизейблино ли основное окно IsWindowEnabled. D>Что-то типа D>
D>if not IsWindowEnabled(Application.MainForm.Handle) then
D> // message box active
D>
Ура! Заработало! Функция IsWindowEnabled дает правильный результат, т.е. пока не вызвано дочернее окно, IsWindowEnabled() = 1.
[Skip]
lsv>Ура! Заработало! Функция IsWindowEnabled дает правильный результат, т.е. пока не вызвано дочернее окно, IsWindowEnabled() = 1.
Не дочернее а диалоговое. Там такой функционал, перед тем как вызвать диалоговое окно, VCL и WinApi дизейблит все окна, по этому даный подход работает.
Здравствуйте, lsv, Вы писали:
lsv>У меня в программе в определенное время срабатывает таймер, который вызывает Application->MainForm->Close(); lsv>Всё бы ничего, но есть ситуации когда программе нельзя закрываться, например, когда отображается сообщение вызванное через MessageBox(...). lsv>Возникает вопрос, как определить, есть ли открытое окно MessageBox(...) или нет?
ЕМНИП, там же есть событие OnCloseQuery, у которого var-параметр CanClose. По умолчанию он True, но если у себя в обработчике поставить туда False, то форма останется жить.