1.3.2.4. Перевод приложения на передний план

1.3.2.4. Перевод приложения на передний план

Первая копия приложения, получив команду от другой копии, должна вывести себя на передний план. Казалось бы, все просто: с помощью функции SetForegroundWindow мы можем вывести туда любое окно. Однако так было только до Windows 95 и NT 4. В более поздних версиях введены ограничения, и теперь программа не может вывести себя на передний план по собственному усмотрению. Функция SetForegroundWindow просто заставит мигать соответствующую кнопку на панели задач.

Тем не менее, если программа свернута, команда Application.Restore не только восстанавливает окно, но и выводит его на передний план, что нам и требуется. Ну а если программа не свернута, то "выливаем из чайника воду и тем самым сводим задачу к предыдущей": сначала сворачиваем приложение с помощью Application.Minimize, а потом разворачиваем его. Цели мы добились — главное окно на переднем плане.

Дело портит только то, что изменение состояния окна сопровождается анимацией: видно, как главное окно сначала сворачивается, а потом разворачивается. Чтобы убрать этот неприятный эффект, можно на время сворачивания/разворачивания окна запретить анимацию, а потом восстановить ее. С учетом этого метод GoToForeground выглядит так, как показано в листинге 1.50.

Листинг 1.50. Перевод приложения на передний план

// Перевод приложения на передний план

procedure TDKSViewMainForm.GoToForeground;

var

 Info: TAnimationInfo;

 Animation: Boolean;

begin

 // Проверяем, включена ли анимация для окон

 Info.cbSize:= SizeOf(TAnimationInfo);

 Animation:= SystemParametersInfo(SPI_GETANIMATION,

SizeOf(Info), @Info, 0 and (Info.iMinAnimate <> 0);

 // если включена, отключаем, чтобы не было ненужного мерцания

 if Animation then

 begin

Info.iMinAnimate:= 0;

SysteParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);

 end;

 // Если приложение не минимизировано, минимизируем

 if not IsIconic(Application.Handle) then Application.Minimize;

 // Восстанавливаем приложение. При этом оно автоматически выводится

 // на передний план

 Application.Restorе;

 // Если анимация окон была включена, снова включаем ее

 if Animation than

 begin

Info.iMinAnimate:= 1;

SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);

 end;

end;

Теперь у нас сделано все, что нужно: приложение умеет ассоциировать расширение с двумя командами; проверять, не ассоциировано ли расширение с другим приложением, и если да, предлагать пользователю установить эту ассоциацию; запрещать запуск второй копии приложения, переводя вместо этого на передний план первую копию; передавать параметры второй копии первой, чтобы она могла выполнить требуемые действия.

Данный текст является ознакомительным фрагментом.