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

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

TrayIcon


ORMADA ©   (2007-01-26 10:42:00) 

Всем привет!
Опять мучаю трейикон...

хочу сделать чтобы прога работала следующим образом
при прилике по трейикон
если форма приложения полностью видима (частично не перекрывается другими окнами)
то следовательно приложение сворачивается в траей в противном случае показывается...

но возникла следующая трабла
как определить при клике по трейиконке что форма ничем не перекрыта
GetForegroundWindow <> Application.Handle)

такой код не проходит т.к. при клике по трею фокус уходит с главной формы и GetForegroundWindow всегда будет возвращать НЕ Application.Handle....


Elen   (2007-01-29 12:19:00) [1]


> т.к. при клике по трею фокус уходит с главной формы

The GetForegroundWindow function returns the handle of the foregroundwindow
Причем тут фокус? (в общем у меня GetForegroundWindow <> Form1.Handle работает без проблем)


evvcom   (2007-01-29 11:58:00) [2]

Продвинутое запуздыривание иконки? Растет форум :)


Separator   (2007-01-29 11:54:00) [3]

А не проще проверять на visible mainform?


ORMADA   (2007-01-29 11:37:00) [4]

решение найдено
именно так как я и говорил
через поиск частично перекрывающих окон

 function IsTopMost(wnd: HWND): Boolean;
 begin
   Result := (GetWindowLong(wnd, GWL_EXSTYLE) or WS_EX_TOPMOST) <> 0;
 end;

var
 wnd                                   : HWND;
 r1, r2, r3                            : TRect;
begin
 if not FIsMinimized then
 begin
   wnd := Handle;
   repeat
     wnd := GetNextWindow(wnd, GW_HWNDPREV);

     if IsTopmost(wnd) then
       if IsWindowVisible(wnd) then
       begin
         GetWindowRect(wnd, r1);
         GetWindowRect(Application.MainForm.Handle, r2);
         if IntersectRect(r3, r1, r2) then
         begin
           FIsMinimized := True;
           break;
         end;
       end;
   until wnd = 0;
 end;

 if FIsMinimized then
 begin
   TrayIcon.ShowMainForm;
   TrayIcon.HideTaskbarIcon;
   FIsMinimized := False;
 end
 else
 begin
   Application.Minimize;
   TrayIcon.HideMainForm;
   FIsMinimized := True;
 end;


ORMADA   (2007-01-26 19:57:00) [5]

есть дурное желание сделать именно как описал...

GetForegroundWindow <> Application.MainForm.Handle

тоже не то
т.к. при клике по трею фокус уходит с главной формы (думаю на десктоп (вероятно HWND=0))

пробовал делать так

// if not FIsMinimized then
//  begin
//    if (GetForegroundWindow = Application.MainForm.Handle) then
//    begin
//      Application.Minimize;
//      TrayIcon.HideMainForm;
//      FIsMinimized := False;
//      exit;
//    end
//    else
//    begin
//      SetForegroundWindow(Application.Handle);
//      exit;
//    end;
//  end;

 if FIsMinimized then
 begin
   TrayIcon.ShowMainForm;
   TrayIcon.HideTaskbarIcon;
   FIsMinimized := False;
 end
 else
 begin
   Application.Minimize;
   TrayIcon.HideMainForm;
   FIsMinimized := True;
 end;


Elen   (2007-01-26 13:20:00) [6]


> ORMADA

Кстати Application.Handle это не FormXX.handle. ;)


Elen   (2007-01-26 13:08:00) [7]


> ORMADA

GetForegroundWindow <> Form1.Handle


Дмитрий Белькевич   (2007-01-26 13:05:00) [8]

Есть мнение, что этим заморачиваться не нужно - просто сворачивай и разворачивай.


Наверх

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