![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать окно активным [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 как использовал?