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