Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 935

/ вопрос решён /

Здравствуйте, уважаемые эксперты!

Я создаю сообщение через API-функцию MessageBox(0, 'Для продолжения нажмите кнопку <OK>.', 'Мое сообщение', MB_OK or MB_ICONINFORMATION).

Так вот, можно программно нажать кнопку ОК в этом сообщении через какое-то время, чтобы прога продолжила работу?

Заранее спасибо!

Muratov Radik Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 26 марта 2010, 10:59
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Muratov Radik!
оказывается, в winXP и старше есть недокументированная функция, которая как раз выполняет поставленную задачу.

 
// описываем и экспортируем функцию
const
  MB_TIMEDOUT = 32000;
 
function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD; dwMilliseconds:
DWORD): Integer; stdcall; external user32 name 'MessageBoxTimeoutA';
 
...
 
procedure TForm1.Button1Click(Sender: TObject) ;
var
  iRet: Integer;
  iFlags: Integer;
begin
   iFlags := MB_OK or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION;
   MessageBoxTimeout(Application.Handle, 'Test a timeout of 2 seconds.', 'MessageBoxTimeout Test', iFlags, 0, 2000) ;
 
   iFlags := MB_YESNO or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION;
   iRet := MessageBoxTimeout(Application.Handle, 'Test a timeout of 5 seconds.', 'MessageBoxTimeout Test', iFlags, 0,
5000) ;
   case iRet of
     IDYES:
       ShowMessage('нажали Да') ;
     IDNO:
       ShowMessage('нажали Нет') ;
     MB_TIMEDOUT:
       ShowMessage('Таймаут) ;
   end;
end;
Но если хочется красивое окошко с таймером и другими красотами - лучше создать свою форму с нужным поведением.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 марта 2010, 11:17
Оценка за ответ: 5

Комментарий к оценке: Нет, не нужно красивое окошко, это то, что нужно. Спасибо большое!

Ответ #2. Отвечает эксперт: min@y™

А я проще сделал. Положил на форму кнопку и таймер, сделал в инспекторе Timer1.Enabled:= False. Затем написал 2 обработчика - на клик кнопки и срабатывание таймера:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled:= True;
  MessageBox(0, 'Для продолжения нажмите кнопку <OK>.', 'Мое сообщение', MB_OK or MB_ICONINFORMATION);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  hMsg: HWND;
begin
  Timer1.Enabled:= false;
  hMsg:= FindWindow(nil, 'Мое сообщение');
  if hMsg <> 0
    then SendMessage(hMsg, WM_CLOSE, 0, 0);
end;

В итоге сообщение закроется через столько миллисекунд, сколько указано в свойстве Interval таймера.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 26 марта 2010, 11:22
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 26 марта 2010, 13:30; участников в обсуждении: 2.
Muratov Radik

Muratov Radik (статус: Посетитель), 26 марта 2010, 13:05 [#1]:

min@y™: И что, этот вариант работает? У MessageBox разве есть Handle? Это разве окно? Смотрел в хелпе по дельфи, там ни слова не было про handle
Muratov Radik

Muratov Radik (статус: Посетитель), 26 марта 2010, 13:08 [#2]:

Хмм, да, работает. Я тоже хотел так сделать, но думал, что MessageBox не имеет хендла, а следовательно и сообщения посылать некому.
min@y™

min@y™ (статус: Доктор наук), 26 марта 2010, 13:30 [#3]:

Цитата (Muratov Radik):

но думал, что MessageBox не имеет хендла

Думать вредно! Надо проверять.
Как окно сообщения может не иметь хэндла? Это ж окно! Причём, каждая кнопка на этом окне тоже имеет свой хэндл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.03 сек.