![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Окошко, не желающее становиться активным
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 10:59:00) [21]>>Song
Я чего-то непойму...
TRxTrayIcon = class(TComponent)
private
...
FOnClick: TMouseEvent;
...
published
...
property OnClick: TMouseEvent read FOnClick write FOnClick;
...
end;
Где он посылает сообщения окну?! В этом коде видно только обработчик события мышиного клика по иконке, которое я использую для востановления окна (Application.Restore). Нифига он ничего непосылает! И без WM_NULL всё работает без заморочек и глюков. В чём дело? Кто тогда посылает этот "нуль" окну?
Zemal (2002-10-16 10:47:00) [22]>>Song
Спасибо. Действительно, чтобы не мучаться с размещением иконки в трее и неписать лишкего кода, от лени своей просто бросил RxTrayIcon на форму и обработал события сворачивания-разворачивания... в общем-то и так заработало... а щас слазию посмотрю в исходники где этот WM_NULL посылается :). Спасибо, что натолкнул :).
Jel (2002-10-16 10:35:00) [23]Спасибо всем за ответы.
Попробую воспользоваться советом и перепишу код, как советует Song.
Song (2002-10-16 10:30:00) [24]Потому что Вы используете компонент, а в нём это уже реализовано.
Zemal (2002-10-16 10:22:00) [25]
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.TrayIconClick(Sender:TObject;
Button:TMouseButton; Shift:TShiftState; X,Y:Integer);
begin
Application.Restore;
end;
Вот такой код у меня работает без проблем. Я думаю по названиям процедур догадаешься на какие события они вызываются... попробуй также. Кстати, без всяких WM_NULL работает... почему незнаю.
Song (2002-10-16 10:22:00) [26]Вы сделайте всё как там написано и у_Вас_всё_будет_работать
Jel (2002-10-16 10:16:00) [27]Да, Вы правы. Извините за излишнюю поспешность, однако проблемы это не решает. И, кстати, если не затруднит, объясните пожалуйста почему недостаточно просто присвоить
msg.result := 0;
для индикации завершения обработки сообщения. И что даст вызов
PostMessage(Handle,WM_NULL,0,0)?
Song (2002-10-16 10:07:00) [28]В том топике что я привёл WM_NULL передаётся после нажатия на значок в трее. Плохо искали.
Jel (2002-10-16 10:06:00) [29]
> WM_NULL надо передавать. (C) Song.
Куда передавать? Можно поподробнее? В указанном Вами источнике ссылки на эту константу отсутствуют.
В дополнение - выяснил что приведенный мной кусок кода не работает в обработчике сообщения, но прекрасно работает будучи повешенным на пункт pop-up-а (который вызывается из того же обработчика сообщения.) Кто-нибудь может это прокоментировать?
Kibitzer (2002-10-16 00:09:00) [30]Ещё посмотри здесь: http://delphibase.endimus.ru/?action=viewfunc&topic=appctrl&id=10031
Song (2002-10-15 19:48:00) [31]WM_NULL надо передавать. Смотри подробней здесь: http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1020241631;start=11