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 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


Страницы:   1 2

Наверх

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