Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2010, 20:02   #1
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
Печаль Трей

Всем добрых суток! Возникла необходимость сворачивания программы в трей.Пробовал так, но всегда срабатывает Procedure WMGetSysCommand(var Message :TMessage); message WM_SYSCOMMAND;

Код:
 protected
    //Здесь "ловится" событие минимизации окна
    Procedure WMGetSysCommand(var Message :TMessage); message WM_SYSCOMMAND;
  private
    { Private declarations }
  public
    { Public declarations }
     autoClose:       Boolean;    // Авто-закрывать после срабатывания
    procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY; //Нажатие кнопки в Tray
    procedure RestoreMainForm;
    procedure HideMainForm;
    procedure CreateTrayIcon(n:Integer);
    procedure DeleteTrayIcon(n:Integer);
  end;

var
  Form1: TForm1;
  Memory: string;    
  exePath: string;    
  restartLoad: Boolean;  
implementation

uses Unit2;

{$R *.dfm}
procedure trayPopup(p: Tpoint);
begin
GetCursorPos(p);
SetForegroundWindow(Application.MainForm.Handle);
Form1.trayMenu.Popup(P.X, P.Y);
end;

procedure TForm1.WMICON(var msg: TMessage); //Срабатывание меню в Tray
var P : TPoint;
begin
 case msg.LParam of             // обработка обратных сообщений
 WM_LBUTTONUP: trayPopup(p);    //по нажатию левой клавиши мыши
 WM_RBUTTONUP: trayPopup(p);    //по нажатию правой клавиши мыши
 WM_LBUTTONDBLCLK : begin       //Двойной щелчок, восстанавливаем окно и убираем значок
      deleteTrayIcon(1);
      RestoreMainForm;
      end;
 end;    
end;

procedure TForm1.DeleteTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
 with nidata do
  begin
   cbSize := SizeOf(TNotifyIconData);
   Wnd := Self.Handle;
   uID := 1;
  end;
  Shell_NotifyIcon(NIM_DELETE, @nidata);   // удаление значка
end;

procedure TForm1.CreateTrayIcon(n:Integer);
var nidata : TNotifyIconData;
onOff:     String;
begin
 with nidata do
  begin
   cbSize := SizeOf(TNotifyIconData);
   Wnd := Self.Handle; //HWND
   uID := 1;          // номер значка
   uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; //обрабатываемые флаги
   uCallBackMessage := WM_MYICONNOTIFY;
   hIcon := Application.Icon.Handle;  
   StrPCopy(szTip,onOff+'Моя прграмма');
  end;
  Shell_NotifyIcon(NIM_ADD, @nidata);    
end;

procedure TForm1.HideMainForm;
begin //при сокрытии окна
  Application.ShowMainForm := False;
  ShowWindow(Application.Handle, SW_HIDE);
  ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;

procedure TForm1.RestoreMainForm;
var i,j : Integer;
begin
  Application.ShowMainForm := True;
  ShowWindow(Application.Handle, SW_RESTORE);
  ShowWindow(Application.MainForm.Handle, SW_RESTORE);
    for I := 0 to Application.MainForm.ComponentCount -1 do
      if Application.MainForm.Components[I] is TWinControl then
        with Application.MainForm.Components[I] as TWinControl do
          if Visible then
          begin
            ShowWindow(Handle, SW_SHOWDEFAULT);
            for J := 0 to ComponentCount -1 do
              if Components[J] is TWinControl then
                ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);
          end;
end;

Procedure TForm1.WMGetSysCommand(var message : TMessage);
begin
 inherited; //обработка минимизирвания окна
 if (Message.wParam=SC_MINIMIZE) then
 begin
       HideMainForm;
       CreateTrayIcon(1);
       end;
       end;
исправте косяк пожалуйста!Зарание спасибо!!!
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 10.08.2010, 20:06   #2
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

А если просто скрыть окно?
Код:
procedure TForm1.HideMainForm;
begin //при сокрытии окна
  Application.ShowMainForm := False;
  CreateTrayIcon(1);
  form1.hide;
end;
Вместо WMGetSysCommand
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 20:14   #3
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

не надо чтоб она в трей сворачивалась как Download Master или Агент
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 10.08.2010, 20:25   #4
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Ну а с чего ты решил, что она не будет этого делать?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 20:37   #5
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Ведь делает на редкоиногда процедура не срабатывает
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 10.08.2010, 20:43   #6
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

а еще раз можно код посмотреть теперешний?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 20:46   #7
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

в смысле весь проект?
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 10.08.2010, 20:52   #8
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

в смысле, как в первом посте
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 10.08.2010, 21:14   #9
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

смотрите во вложение
Вложения
Тип файла: txt Main.txt (19.9 Кб, 116 просмотров)
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 10.08.2010, 21:18   #10
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

А зачем столько мучений, вопросов, порожденных непонятками типа "ведь делает но редко", когда существуют уже проверенные и объезженные компоненты работы с треем (CoolTrayIcon, к примеру), используя которые не отвлекаешься на мелочи, а делаешь программу ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свернуть в трей Nice42ru Помощь студентам 1 05.02.2010 17:02
Значок в трей doniyor Общие вопросы Delphi 6 25.01.2010 02:02
В трей =) Lemo Помощь студентам 8 10.07.2009 17:13
Трей и меню Патрон Общие вопросы Delphi 9 12.03.2008 17:31
Трей и шатдаун oLMeR Общие вопросы Delphi 1 04.12.2006 14:41