Прошу посильной помощи в следующем, вроде бы простом вопросе. Как сделать так, чтобы она была всегда сверху только для форм своего приложения, т.е. если мы переходим из своей программ в другую (например Explorer не важно) чтобы эта форма не маячила перед глазами.
Подобного эффекта можно добиться перекрыв метод DoShow и вызвав в нем окно с сообщением. (Delphi 5)
procedure TCustomDockFormEx.DoShow;
begin
inherited;
MessageBox(0,'Закрой меня','',0);
end;
Но понятное дело это несколько неудобно для пользователя.
Буду крайне благодарен всем откликнувшимся.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
24-12-2010 17:43
Решение проблемы (проверялось только на XP):
procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnDeactivate := AppDeactivate;
end;
procedure TMainForm.AppDeactivate(Sender: TObject);
begin
if Assigned(OnTopForm) and OnTopForm.Visible then
ShowWindow(OnTopForm.Handle, SW_SHOWNA);
end;
Использование Application.RestoreTopMosts приводит к тому, что
fsStayOnTop формы перекрывают все окна.
13-09-2006 23:21 | Комментарий к предыдущим ответам
Вообще у меня возникла такая же проблема при переходе на Windows XP SP2, на Win2000Sp4 все работало как надо. При FormStyle = fsStayOnTop неглавная форма приложения была поверх окон только самого приложения и пряталась при потере фокуса приложением. В Xp ее стало видать всегда....
В чем тут дело?
Вопрос остался открытым!
Но спасибо за поданную идею. После долгих экспериментов остановился на таком коде
procedure TCustomDockFormEx.AppEventsActivate(Sender: TObject);
begin
// Когда приложение активизируется, форма располагается "всегда сверху"
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOSENDCHANGING);
end;
procedure TCustomDockFormEx.AppEventsDeactivate(Sender: TObject);
begin
// Когда приложение становится пассивным, форма помещается пож верхнее
// окно и перестает быть всегда сверху
SetWindowPos(Handle,GetForegroundWindow,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOSENDCHANGING);
SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOSENDCHANGING);
end;
Однако если в момент когда приложение неактивно отображается окно TOPMOST, то оно может перекрываться обычными окнами других приложений. Как его программно отображать в таком режиме не понятно.
Проще всего вообще убирать эту форму с экрана, если ваше приложение стало неактивным,
а когда приложение получит управление - форму опять показывать. Для это надо в форму
добавить компонент ApplicationEvents (закладка Additional в Delphi 7);
в обработчике события OnDeactivate форму прятать (Hide); в обработчике OnActivate -
показывать (Show).
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.