|
Вопрос # 3 935/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!
Я создаю сообщение через API-функцию MessageBox(0, 'Для продолжения нажмите кнопку <OK>.', 'Мое сообщение', MB_OK or MB_ICONINFORMATION).
Так вот, можно программно нажать кнопку ОК в этом сообщении через какое-то время, чтобы прога продолжила работу?
Заранее спасибо!
 |
Вопрос задал: 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 (статус: Посетитель), 26 марта 2010, 13:05 [#1]:
min@y™: И что, этот вариант работает? У MessageBox разве есть Handle? Это разве окно? Смотрел в хелпе по дельфи, там ни слова не было про handle
|
|
Muratov Radik (статус: Посетитель), 26 марта 2010, 13:08 [#2]:
Хмм, да, работает. Я тоже хотел так сделать, но думал, что MessageBox не имеет хендла, а следовательно и сообщения посылать некому.
|
|
min@y™ (статус: Доктор наук), 26 марта 2010, 13:30 [#3]:
Цитата (Muratov Radik):
но думал, что MessageBox не имеет хендла
Думать вредно! Надо проверять.
Как окно сообщения может не иметь хэндла? Это ж окно! Причём, каждая кнопка на этом окне тоже имеет свой хэндл.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|