Apr 22

MessageBoxTimeOut

Хоть и ругают MS за большой объем операционной системы, но как много всего в ней. Например, в XP появилась функция MessageBoxTimeOut - это обычный MessageBox, но исчезающий через определенный промежуток времени.

 

Так как эта функция недокументированна, ее нельзя найти в модуле Windows.pas, но можно самому экспортировать:

MB_TIMEDOUT = 32000;

function MessageBoxTimeOut; external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutA; external user32 name 'MessageBoxTimeoutA';
function MessageBoxTimeOutW; external user32 name 'MessageBoxTimeoutW';

Описание функции следующее:

function MessageBoxTimeOut(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;

function MessageBoxTimeOutA(hWnd: HWND; lpText: PChar; lpCaption: PChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;

function MessageBoxTimeOutW(hWnd: HWND; lpText: PWideChar; lpCaption: PWideChar; uType: UINT; wLanguageId: WORD; dwMilliseconds: DWORD): Integer; stdcall;

 

Функции возвращают теже результаты, что и обычные MessageBox (ID_***), и дополнительно MB_TIMEDOUT, определенный в константе выше. Теперь можно использовать функции следующим образом:

var
  iResult: Integer;
  iFlags: Integer;
begin
  // Выводим сообщение с кнопками Да и Нет на 5 секунд
  iFlags  := MB_YESNO or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION;
  iResult := MessageBoxTimeout(Application.Handle, 'Сообщение на 5 секунд.', 'Проверка MessageBoxTimeout', iFlags, 0, 5000);

  // iResult = MB_TIMEDOUT если ни одна кнопка не нажата, иначе возвращается код нажатой кнопки
  case iResult of
  IDYES:  // Нажата кнопка Да
    ShowMessage('Да');
  IDNO:  // Нажата кнопка Нет
    ShowMessage('Нет');
  MB_TIMEDOUT: // Ни одна кнопка не нажата, время вышло
    ShowMessage('Время окончилось.');
  end;
end;

 

Конечно, область применения данной функции мала, да и пользователь может "испугаться", если сообщение вдруг пропадет с экрана, но иногда может пригодиться.

 

Источник.


  1. Корвин
     Add karma Subtract karma  +0
    Цитировать.

    Вообще-то фишка старая… И уже давно изученная…
    Даже Борланд писал
    http://dn.codegear.com/article/32736
    ——–
    Не в обиду автору, но было бы лучше для некоторых вещей
    указывать первоисточник.

    1
  2. Виктор
     Add karma Subtract karma  +0
    Цитировать.

    Не соглашусь с предыдущим товарищем!
    Новое – это хорошо забытое старое!

    Функция, однозначно, полезная!
    Например, в программах автоматической обработки данных, когда нужно вывести запрос на действие пользователя и , если пользователь недоступен, выполнить действие по умолчанию!

    Спасибо, воспользуемся! :-)

    2
  3. aktuba
     Add karma Subtract karma  +0
    Цитировать.
    Комментарий автора

    Корвин, а может стоит тогда смотреть пост полностью? Внизу источник как-раз и указан, причем именно на сайт codegear.

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

    3
  4. Корвин
     Add karma Subtract karma  +0
    Цитировать.

    Посмотрел.
    Реально я попутал…
    Приношу свои извинения ;-)

    4
  5. Rushyan
     Add karma Subtract karma  +0
    Цитировать.

    Добавил в закладки.

    5

Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.