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

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

Окошко, не желающее становиться активным


Страницы:   1 2

Jel ©   (2002-10-15 17:24:00) 

Проблема проста до идиотизма. Сворачиваю программку в трей, обрабатывая WM_SysCommand. То бишь прячу форму и кнопку на таскбаре. Потом из обработчика NotifyIcon пытаюсь развернуть обратно. Результат - окошко восстанавливается но не на переднем плане а за остальными окнами. Нужно вытащить его наверх. Пишу


if a.LParam = 514 then begin // знаю - константа в тексте некрасиво (это отпускание левой кнопки мыши)
TrayHideIcon; // здесь убираю иконку из трея
ShowWindow(Application.Handle, SW_SHOWNORMAL);
ShowWindow(handle, SW_SHOWNORMAL);
SetForegroundWindow(handle); // а вот тут - только начинает мигать кнопка на таскбаре - окно не всплывает!
// SetWindowPos(Handle, HWND_TOP, 0,0,0,0, SWP_NOSIZE + SWP_NOMOVE); // пробовал еще так
// BringWindowToTop(handle); // и вот так
// SendMessage(handle, WM_SYSCOMMAND, SC_RESTORE, 0); // и сяк - результат нулевой
end;
a.Result := 0;


Где грабли-то? Чего я не сделал или сделал не так?
Заранее спасибо.


Zemal   (2002-10-16 13:25:00) [1]

>>Song
Рад был посодействовать! :)


Song   (2002-10-16 13:18:00) [2]

Просто у нас разные методики. Вы прячете в таскбар (т.е. минимизируете попросту говоря), а потом скрываете саму кнопку. А я ничего не мимизирую, а просто прячу и окно и кнопку. Кстати, спасибо, нашёл, ошибку в той "статейке" благодаря этому обсуждению.


Zemal   (2002-10-16 13:15:00) [3]

Application.OnMinimize >>
ShowWindow(Application.Handle, SW_HIDE); {сворачивается окно самостоятельно и нечего в это вмешиваться, а эта процедура скрывает кнопаню в таскбаре :) }

Application.OnRestore >>
ShowWindow(Application.Handle, SW_SHOW); {при разворачивании окна, показываем кнопаню в таскбаре}
SetForegroundWindow(Application.Handle); {а эта процедура делает приложение активным и показывает его :) }


Zemal   (2002-10-16 13:08:00) [4]

>>Song
Именно так :). По этому событию и надо делать Application.Restore, а в событиях Application.OnMinimize и Application.OnRestore делать так:

Application.OnMinimize >>
ShowWindow(Application.Handle, SW_HIDE);

Application.OnRestore >>
ShowWindow(Application.Handle, SW_SHOW);
SetForegroundWindow(Application.Handle);

И всё работает, под Win2k по крайней мере работает :). Под 98 незнаю... возможно и небудет :(.


Song   (2002-10-16 12:42:00) [5]

>>Все не просто, а очень просто
Вы имеет ввиду SW_SHOW на событиий WM_LBUTTONUP ?


Zemal   (2002-10-16 12:23:00) [6]

>>Jel
Поздравляю! :)


Zemal   (2002-10-16 12:20:00) [7]

Только прошу обратить внимание, что я мессагу шлю не окну (Handle), а объекту Application.


Jel   (2002-10-16 12:19:00) [8]

Нашел!!!!

Все не просто, а очень просто

ShowWindow(Application.Handle, SW_SHOW);
ShowWindow(handle, SW_SHOW);

Причем именно SW_SHOW, а не SW_SHOWNORMAL !!!

Вот они, грабли-то!!!
И никаких вызовов WinApi не нужно.


Zemal   (2002-10-16 12:07:00) [9]

>>Jel
Зачем тебе RxLib? Ты можешь вешать значёк в трей и ручками! Я же написал, что RxTrayIcon никак с окном неработает!!! Единственно, что тебе надо, так это обработать клик мышки по иконке в трее. И всё будет работать, но как пишет Song, будет работать только под Win2k. Теперь понятно?


Jel   (2002-10-16 11:56:00) [10]

Видимо придется пойти по этому пути и использовать RXLib. А казалось все так просто, зачем вешать еще один компонент... :)


Song   (2002-10-16 11:54:00) [11]

У меня в W98se работает отлично, по крайней мере у меня.
Начиная с w2k проблема начинается из-за выделенной строчки.
...
WM_RBUTTONUP: {Действия, выполняемый по одинарному щелчку правой кнопки мыши}
Begin
SetForegroundWindow(Handle);
PopupMenu1.Popup(p.X,p.Y);
...


Дело в том, что MS изменило работу SetForeGroundWindow(), чтобы не мешать программе, имеющий фокус ввода тем что на передний план выведется программа из трея. Например, представьте, что Вы что-то набираете в ворде и вдруг чего-то выплывает на передний план и, если Вы не смотрели на экран (так некоторые делают), когда набирали, Вы нажали много кнопок впустую. Такое поведение было введено специально.
Изменить эту фишку можно несколькими способами. Один из них есть в UBPFD. А вообще Вы можете кое-что почитать об этом здесь: http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1034681936&n=5


Zemal   (2002-10-16 11:53:00) [12]

У меня, кстати, тоже Delphi 6.0 (Build 6.163) и Win 2000 Server sp2.
>>Jel
Смотри мой код:

procedure TfmMain.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
Application.OnMinimize := AppMinimize;
Application.OnRestore := AppRestore;
end;

procedure TfmMain.AppMinimize(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TfmMain.AppRestore(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_SHOW);
SetForegroundWindow(Application.Handle);
end;

procedure TfmMain.RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Application.Restore;
end;

Этот код работает корректно. Как часики :). Правда я использовал трейикон из RX, но в исходниках класса TRxTrayIcon я ненашол ниодной функции работы с окном... она вообще неработает с окном (просто вешает иконку в трей и предоставляет различные события мышки). Всё работает безо всяких посылок WM_NULL. Почему? А сам незнаю... просто работает :).


Jel   (2002-10-16 11:47:00) [13]

>> Song

Пробовал на 2к и на 98se


Song   (2002-10-16 11:46:00) [14]

2Jel © (16.10.02 11:43)
У Вас w2k ?


Jel   (2002-10-16 11:43:00) [15]

>> Song

Реализовал все как Вы описали. Результат такой же как у моего кода - из менюшки - пожалуйста, а вот по левому клику - восстанавливается, но НЕ поверх других окон.

Хотелось бы уточнить, вы тестировали приведенный код или работать он должен теоретически? Или же такое странное поведене окна наблюдается только на моей версии Delphi 6.0 (Build 6.163)?


Zemal   (2002-10-16 11:31:00) [16]

>>Separator
Вот о чём я и говорю!!! Я же привожу код из своей прилаги, которая сворачивается в трей и прячет кнопаню в таскбаре. Причём я непосылаю форме никаких WM_NULL и всё прекрасно и без глюков работает. Вот в чём фишка-то! Сворачивается... и разворачивается... сворачивается... и выходит... входит... и выходит... :)


Separator   (2002-10-16 11:25:00) [17]

Он и не посылает, сам по себе RxTrayIcon на событие OnClick ничего не делат. Но ты ведь сначала бросаешь компонент на форму, а потом сам и создаешь обрабочик события


Zemal   (2002-10-16 11:16:00) [18]

ок


Song   (2002-10-16 11:10:00) [19]

Пошлите мне на почту исходник, я гляну, Вам отпишу


Zemal   (2002-10-16 11:02:00) [20]

Могу выложить всё описание класса TRxTrayIcon... оно небольшое... в одной месаге поместится... и во всей реализации класса нет ниодной функции, шлющей сообщение окну.


Страницы:   1 2

Наверх

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