Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуздырить иконку в трей (c), Delphi XE, TTrayIcon, кривые руки 
:(
    Опции темы
Чучмек
Дата 18.1.2012, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 7
Всего: 41



Цитата(MetalFan @  17.1.2012,  14:10 Найти цитируемый пост)
TheBat

The Bat! написан на delphi или на чем-то подобном, а delphi компилит ###код smile 
Но из того что удалось понять следует следующее:
Сообщение трея $0401
Сообщения трея принимает не основная форма. 
В случае когда  основное окно The Bat есть foregroun:
   По сообщению основного окна WM_ACTIVATE/WA_INACTIVE запоминается текущее время.
   Если клик в трее происходит через "менее чем ...", окно сворачивается в трей. 


Добавлю:
TheBat время получает через GetTickCount
менее чем - это 500 тиков.

Это сообщение отредактировал(а) Чучмек - 18.1.2012, 15:06


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
MetalFan
Дата 18.1.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Чучмек, я так и предполагал... одна из мыслей была как раз по определению некой временной дельты между потерей активности приложения и кликом по трею...
Теперь за дело говорю - спасибо!


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Qu1nt
Дата 18.1.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



MetalFan, чем мой последний вариант не устроил?
PM MAIL   Вверх
CodeMonkey
Дата 18.1.2012, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата
В случае когда  основное окно The Bat есть foregroun:
   По сообщению основного окна WM_ACTIVATE/WA_INACTIVE запоминается текущее время.
   Если клик в трее происходит через "менее чем ...", окно сворачивается в трей. 


Эге, я же говорил.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
kuzduk
  Дата 13.9.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 21.9.2011

Репутация: нет
Всего: 2



Эгегей! Я знаю как просто и красиво решить данную проблему, когда при нажатии на трей-иконку надо определить активна ли была наша программа или нет!


Моё решение такое:
Код


type
  TForm1 = class(TForm)
   
   public
   procedure TrayClick(var msg: TMessage); message WM_MYICONNOTIFY; //перехватываем события трей-иконки

  end;


var
  _WindowActiv: Boolean = False;








implementation



procedure TForm1.TrayClick(var msg: TMessage);
begin

case msg.LParam
of    

  
  WM_MOUSEMOVE://событие когда навели курсор на трей-иконку нашей программы 
  begin
    //Запоминаем во внешнюю переменную активно ли окно нашей программы
    if (Application.Handle = GetForegroundWindow) or (Self.Handle = GetForegroundWindow)
    then _WindowActiv := True
    else _WindowActiv := False;
  end;


  WM_LBUTTONDOWN://событие когда кликнули ПКМ по трей-иконке нашей программы
  begin
          if IsIconic(Application.Handle) //свёрнута ли форма
//
          then//свёрнуто:
          begin
              Application.Restore;
              SetForegroundWindow(Application.Handle); //Вывести окно на передний план
              ShowNeedIcon(IconOnRestore.ItemIndex);
          end

          else//НЕ свёрнуто:
          begin
//              ВНИМАНИЕ!!! Self.Handle <> Application.Handle
//              if GetWindow(Self.Handle, GW_HWNDFIRST) = Self.Handle ...
//              if GetForegroundWindow = Self.Handle ...
//              if GetActiveWindow = Self.Handle ...
//              if GetLastActivePopup(GetDesktopWindow) = Self.Handle ...



              //Гемморой в том, что после клика по трей-иконке активной становится панель задач,
              //следовательно надо найти предыдущее активное окно,
              //если было активно окно нашей программы => свернуть программу
              //если было активно окно НЕ нашей программы => вывести окно нашей программы на передний план
              
              if _WindowActiv = true

              then//окно активно => сворачиваем
              begin
//                ShowMessage('активно');

                Application.Minimize;
                ShowNeedIcon(2);
                _WindowActiv := False;
              end

              else//окно пассивно => на передний план
              begin
//                ShowMessage('пассивно');

                SetForegroundWindow(Application.Handle);
                _WindowActiv := True;
              end;
          end;
  end;

end;

end;





--------------------


через Z-последовательности определить ничего не получилось - куча посторонних окон...

также можно попробовать поиграть с GetLastActivePopup(GetDesktopWindow)


--------------------


всем рекомендую качать мой модуль KuTray для работы с иконкой в трее и панели задач: http://kuzduk.narod.ru/_tray.html  smile 


также смотрите другие мои полезные модули и программы: http://kuzduk.narod.ru/_tvor.html  smile 

Это сообщение отредактировал(а) kuzduk - 14.9.2012, 12:28
PM MAIL WWW   Вверх
Akella
  Дата 3.2.2013, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Кто-нибудь сталкивался с тем, что в Windows 7 x64 значок TTrayIcon не исчезает из области уведомления, хотя программа закрывается корректно?
Используется D2007 и стандартная компонента TTrayIcon, но немного переделанная:

Код

//уже не помню для чего это нужно было
Type
  TCrackTrayIcon = class(TTrayIcon)
  protected
    procedure WindowProc(var Message: TMessage); override;
  end;

  TfmMain = class(TForm)
...
...


implementation
....
...

procedure TfmMain.FormCreate(Sender: TObject);
begin
//так создаем
  TrayIcon2 := TCrackTrayIcon.Create(Application);
  TrayIcon2.Hint := constAppName + '(' + constSiteName + ')';
  TrayIcon2.Visible := True;
  TrayIcon2.PopupMenu := pmTray;
  TrayIcon2.Icon := Self.Icon;
  TrayIcon2.OnClick := TrayIconClick;


PM MAIL   Вверх
gesper
Дата 3.2.2013, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



А не переделаный так же все делает?
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
Akella
Дата 3.2.2013, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



Всё равно остаётся
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1387 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.