Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать окно активным [D5, WinME, WinXP]


Керик ©   (2002-06-09 05:36:00) 

Помогите, плиз! Моя прога запускается вместе с Windows. Главное окно её при этом не показывается. Для этого я использую Application.ShowMainForm. Когда юзер щёлкает крысой на значок в трее моей проги, то окно появляется на экране, но за всеми другими окнами и неактивным. Я использовал: BringWindowToTop, SetWindowPos, Self.Activate, но ничего не работает! ХЭЛП!


Cobalt   (2002-06-14 06:23:00) [1]

Попробуй сначала Form.Show, Application.ProcessMessages а затем SetForegroundWindow.


Керик   (2002-06-14 05:19:00) [2]

Tkach, мне не надо чтобы окно было всегда на верху, а только чтобы оно при появлении установилось поверх всех, а потом уже если юзер захочет сделать его не на самом верху, то окно должно послушно выполнить перемещение окна из верха в зад. Кстати, а что такое ИМХО?

Diamond Cat ©.
В принцине это работает, выводит окно на верх, но не активизирует его!


Diamond Cat   (2002-06-13 01:32:00) [3]

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


Tkach_   (2002-06-12 12:50:00) [4]

достаточно задать стиль этой формы StayOnTop. А если необходимо, чтобы форма была поверх всех окон системы, даже если она теряет фокус необходимо описать обработчик Application.OnDeactivate.
ИМХО лучше в таких случаях работать именно с объектом Application а не бороться со свойствами самой формы.


interface

TStartForm = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure SetOnTop(Sender: TObject);
end;

implementation

procedure TStartForm.SetOnTop(Sender: TObject);
begin
Application.BringToFront;
end;

procedure TStartForm.FormCreate(Sender: TObject);
begin
FormStyle:=StayOnTop;
Application.OnDeactivate:=setontop;
end;



Керик   (2002-06-12 06:27:00) [5]

2Song © (11.06.02 14:27)
Верно!:-) Это одно и тоже в этом случае!

короед © (11.06.02 15:26)
А второй для того, чтобы окно не постоянно оставалось поверх всех. Только появилось сверху на экране и всё! А BringWindowToTop и SetForegroundWindow не работают :-(

Насчёт SetWindowPos: ты прав, это Width и Height окна, но ты забыл посмотреть на флаги: swp_nosize{не менять размеры} и swp_nomove {не перемещать}.

Только ответ на свой вопрос, изложенный вначале, я так и не получил :-( Может быть кто-то знает?


короед   (2002-06-11 15:26:00) [6]

2Керик

А зачем второй
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, swp_nosize+swp_nomove);?

и еще

SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0{а разве это не Width окна???}, 0{а это не Height???}, swp_nosize+swp_nomove);


SPeller   (2002-06-11 14:39:00) [7]

Давно. Я просто знаю и везде где не смотрел везде было логическое "или". Простое сложение первый раз вижу в таком случае.


Song   (2002-06-11 14:27:00) [8]

2SPeller © (11.06.02 11:43)
Идентично. Битовую арифметику давно не изучали ? :-))


SPeller   (2002-06-11 11:43:00) [9]

swp_nosize+swp_nomove

Это что-то новое... :) swp_nosize orswp_nomove


Керик   (2002-06-11 06:13:00) [10]

Song! Я не открывал эти окна перед тем, как засунуть его в трей. Использую Application.ShowMainForm := Falseещё досоздания окна!
Вот процедура обработки клика по значку в трее:
procedure TLogForm.TrayIconClick(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
LogForm.Show;
TrayIcon.Active := False;
AnimateTray := False;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, swp_nosize+swp_nomove);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, swp_nosize+swp_nomove);
Activate;
end;


easy! SetForegroundWindow(...); - к сожалению не активизирует окно моей проги!


easy   (2002-06-10 16:17:00) [11]

попробуй

SetForegroundWindow(form1.Handle);


Song   (2002-06-09 10:15:00) [12]

А Вы все эти окна открывали перед тем как засунуть приложение в трей ?

И покажите процедуру обработки сообщения от значка.


SPeller   (2002-06-09 06:14:00) [13]

SetWindowPos как использовал?


Наверх

Титульная страница Поиск, карта сайта Написать письмо