Какое окно активно
От: lsv  
Дата: 23.05.17 10:19
Оценка:
У меня в программе в определенное время срабатывает таймер, который вызывает Application->MainForm->Close();
Всё бы ничего, но есть ситуации когда программе нельзя закрываться, например, когда отображается сообщение вызванное через MessageBox(...).
Возникает вопрос, как определить, есть ли открытое окно MessageBox(...) или нет?
Re: Какое окно активно
От: Alex.Che  
Дата: 23.05.17 10:30
Оценка:
GetActiveWindow() + GetClassName()
Posted via RSDN NNTP Server 2.1 beta
Re: Какое окно активно
От: Softwarer http://softwarer.ru
Дата: 23.05.17 10:34
Оценка:
Здравствуйте, lsv, Вы писали:

Вы описываете какую-то странную и противоречивую бизнес-логику. Трудно сказать, что вы хотите на самом деле, но выглядит примерно так: "Если пользователь бросил программу и ушёл на восемь часов, она должна закрыться. Но если он бросил её в тот момент, когда программа показала сообщение "ОК", она так и должна висеть".

Думаю, Вам стоит сформулировать общую задачу — тогда станет понятно и оптимальное решение. Пока могу заметить, что в программах с подобным функционалом обычно пользуются диалоговыми окнами, автоматически закрывающими себя через какое-то время. Ну и пользоваться MessageBox — довольно странная прихоть, из которой всё и растёт, при использовании обычного MessageDlg не было бы никаких проблем.
Re[2]: Какое окно активно
От: lsv  
Дата: 23.05.17 10:43
Оценка:
Здравствуйте, Alex.Che, Вы писали:
AC>GetActiveWindow() + GetClassName()

Попробуйте вызвать GetActiveWindow() в тот момент, когда программа неактивна, допустим пользуетесь другой программой, в этом случае GetActiveWindow() вернет 0.
Re[2]: Какое окно активно
От: lsv  
Дата: 23.05.17 10:53
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, lsv, Вы писали:


S>Вы описываете какую-то странную и противоречивую бизнес-логику. Трудно сказать, что вы хотите на самом деле, но выглядит примерно так: "Если пользователь бросил программу и ушёл на восемь часов, она должна закрыться. Но если он бросил её в тот момент, когда программа показала сообщение "ОК", она так и должна висеть".


S>Думаю, Вам стоит сформулировать общую задачу — тогда станет понятно и оптимальное решение. Пока могу заметить, что в программах с подобным функционалом обычно пользуются диалоговыми окнами, автоматически закрывающими себя через какое-то время. Ну и пользоваться MessageBox — довольно странная прихоть, из которой всё и растёт, при использовании обычного MessageDlg не было бы никаких проблем.


Вы всё верно угадали, пользователи на терминале не закрывают программы, ровно в полночь все программы должны закрыться, но иногда бывают случаи, когда они оставляют программы прям с сообщением "Сохранить документ? Да. Нет.", если в такой ситуации закрыть принудительно программу, то поимеем сотрудника, который вынесет всем мозг, а вот если не закроем, то теперь уже мы имеем право попинать данного сотрудника.
Уйти от MessageBox'ов нельзя.
Вот и появился вопрос, как прочекать, наличие открытого MessageBox'а.
Re[3]: Какое окно активно
От: Alex.Che  
Дата: 23.05.17 10:56
Оценка:
> Вот и появился вопрос, как прочекать, наличие открытого MessageBox'а.

ну сделай ты EnumWindows и найди свой MessageBox.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Какое окно активно
От: lsv  
Дата: 23.05.17 11:02
Оценка:
Здравствуйте, Alex.Che, Вы писали:
AC>ну сделай ты EnumWindows и найди свой MessageBox.

Возможно я задам глупый вопрос ... а как?
Re[5]: Какое окно активно
От: Alex.Che  
Дата: 23.05.17 11:06
Оценка:
> Возможно я задам глупый вопрос ... а как?

что именно? уточни в чем у тебя затык.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Какое окно активно
От: lsv  
Дата: 23.05.17 11:13
Оценка:
Здравствуйте, Alex.Che, Вы писали:
>> Возможно я задам глупый вопрос ... а как?
AC>что именно? уточни в чем у тебя затык.

Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком.
Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?
Re[7]: Какое окно активно
От: Alex.Che  
Дата: 23.05.17 11:16
Оценка:
> Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком.
> Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?

ууу... как всё запущено...
боюсь что не смогу тебе помочь, уж не обессудь
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Какое окно активно
От: Danchik Украина  
Дата: 23.05.17 11:28
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>Здравствуйте, Alex.Che, Вы писали:

>>> Возможно я задам глупый вопрос ... а как?
AC>>что именно? уточни в чем у тебя затык.

lsv>Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком.

lsv>Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?

Думаю тебе хватит проверить не задизейблино ли основное окно IsWindowEnabled.
Что-то типа
if not IsWindowEnabled(Application.MainForm.Handle) then
  // message box active
Re[8]: Какое окно активно
От: lsv  
Дата: 23.05.17 11:43
Оценка:
Здравствуйте, Danchik, Вы писали:

lsv>>Ты предлагаешь воспользоваться функцией EnumWindows, я не очень знаком с этой функцией, точнее совсем не знаком.

lsv>>Как с ее помощью узнать, есть ли у моей главной формы в данный момент какие-то запущенные окна?

D>Думаю тебе хватит проверить не задизейблино ли основное окно IsWindowEnabled.

D>Что-то типа
D>
D>if not IsWindowEnabled(Application.MainForm.Handle) then
D>  // message box active
D>


Ура! Заработало! Функция IsWindowEnabled дает правильный результат, т.е. пока не вызвано дочернее окно, IsWindowEnabled() = 1.
Re[9]: Какое окно активно
От: Danchik Украина  
Дата: 23.05.17 12:13
Оценка:
Здравствуйте, lsv, Вы писали:

[Skip]

lsv>Ура! Заработало! Функция IsWindowEnabled дает правильный результат, т.е. пока не вызвано дочернее окно, IsWindowEnabled() = 1.


Не дочернее а диалоговое. Там такой функционал, перед тем как вызвать диалоговое окно, VCL и WinApi дизейблит все окна, по этому даный подход работает.
Re: Какое окно активно
От: Mr.Delphist  
Дата: 26.09.17 16:43
Оценка:
Здравствуйте, lsv, Вы писали:

lsv>У меня в программе в определенное время срабатывает таймер, который вызывает Application->MainForm->Close();

lsv>Всё бы ничего, но есть ситуации когда программе нельзя закрываться, например, когда отображается сообщение вызванное через MessageBox(...).
lsv>Возникает вопрос, как определить, есть ли открытое окно MessageBox(...) или нет?

ЕМНИП, там же есть событие OnCloseQuery, у которого var-параметр CanClose. По умолчанию он True, но если у себя в обработчике поставить туда False, то форма останется жить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.