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;
Конечно, область применения данной функции мала, да и пользователь может "испугаться", если сообщение вдруг пропадет с экрана, но иногда может пригодиться.
+0