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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не срабатывает нажатие мыши! Не работает левый клик по иконке в трее! 
V
    Опции темы
shatalinalex
  Дата 16.10.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здраствуйте!

Я взял примеры из DRKB (Delphi Russian Knowledge Base) , по добавлению иконки в трей, т.е когда приложение сворачивается появляется иконка в трее, по правому клику появляется PopUpMenu а по левому она должна восстановиться, но не восстанавливается пишу вот так!
Код

Procedure TForm1.Ic(n:Integer;Icon:TIcon);
  Var Nim:TNotifyIconData;
begin
     With Nim do
     Begin
          cbSize:=SizeOf(Nim);
          Wnd:=Form1.Handle;
          uID:=1;
          uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
          hicon:=Icon.Handle;
          uCallbackMessage:=wm_user+1;
          szTip:='опа на ';
    End;
    Case n OF  
      1: Shell_NotifyIcon(Nim_Add,@Nim);
      2: Shell_NotifyIcon(Nim_Delete,@Nim);
      3: Shell_NotifyIcon(Nim_Modify,@Nim);
    End;
end;

procedure TForm1.ControlWindow(var Msg: TMessage);
begin
    if Msg.WParam = SC_MINIMIZE then
      begin
        Ic(1, Application.Icon); // Добавляем значок в трей
        ShowWindow(Handle, SW_HIDE); // Скрываем программу
      end
    else
      inherited;
end;

procedure TForm1.IconMouse(var Msg: TMessage);
var p: tpoint;
begin
      GetCursorPos(p); // Запоминаем координаты курсора мыши
      case Msg.LParam of // Проверяем какая кнопка была нажата
        WM_LBUTTONUP, WM_LBUTTONDBLCLK: {Действия, выполняемый по одинарному или двойному щелчку левой кнопки мыши на зна?ке. В нашем случае это просто активация приложения}
          begin
            Ic(3, Application.Icon); // Удаляем зна?ок из трея
            ShowWindow(Application.Handle, SW_SHOWNORMAL); // Восстанавливаем окно программы
          end;
        WM_RBUTTONUP: {Действия, выполняемый по одинарному щелчку правой кнопки мыши}
          begin
            SetForegroundWindow(Handle); // Восстанавливаем программу в ка?естве переднего окна
            PopupMenu1.Popup(p.X, p.Y); // Заставляем всплыть тот самый TPopUp о котором я говорил чуть раньше
            PostMessage(Handle, WM_NULL, 0, 0) // Обнуляем сообщение
          end;
      end;
    end;


Это сообщение отредактировал(а) Snowy - 16.10.2006, 15:28
PM MAIL   Вверх
Romikgy
Дата 16.10.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(shatalinalex @  16.10.2006,  13:51 Найти цитируемый пост)
ShowWindow(Application.Handle, SW_SHOWNORMAL); // Восстанавливаем окно программы

имхо лучше так    
Код

ShowWindow(Application.Handle, SW_SHOWNORMAL); 
ShowWindow(Handle, SW_RESTORE);
SetForegroundWindow(Handle);


Это сообщение отредактировал(а) Romikgy - 16.10.2006, 15:03


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
shatalinalex
  Дата 16.10.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все равно не получается  smile 

Думал может событие не правильно сделал - попробовал вот так 

Код

procedure TForm1.N3Click(Sender: TObject);
begin
  Ic(3, Application.Icon); // Удаляем зна?ок из трея
  ShowWindow(Application.Handle, SW_RESTORE); // Восстанавливаем окно программы
end;

procedure TForm1.N4Click(Sender: TObject);
begin
  close;
end;
Тоже не пашет! Ничего не понимаю!

Это сообщение отредактировал(а) Snowy - 16.10.2006, 15:24
PM MAIL   Вверх
Snowy
Дата 16.10.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 30
Всего: 484



Полный код покажи.
PM MAIL   Вверх
shatalinalex
Дата 16.10.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ОК кода много я линку кидаю воть http://www.shatalinalex.5gigs.com/progi/Unit1.pas
PM MAIL   Вверх
_hunter
Дата 16.10.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



а сообщение хоть приходит/ловится?
если в обработчике бряку поставить -- сто будет?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
shatalinalex
Дата 17.10.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код


procedure TForm1.IconMouse(var Msg: TMessage);
var p: tpoint;
begin
      GetCursorPos(p);
      case Msg.LParam of WM_LBUTTONUP:
          begin
            showmessage('sdfsdf');
            Ic(3, Application.Icon);
            ShowWindow(Application.Handle, SW_RESTORE);
          end;
        WM_RBUTTONUP:
         begin
            SetForegroundWindow(Handle);
            PopupMenu1.Popup(p.X, p.Y);
            PostMessage(Handle, WM_NULL, 0, 0)
          end;
        WM_LBUTTONDBLCLK:
          begin
            Ic(3, Application.Icon);
            ShowWindow(Application.Handle, SW_RESTORE); 
          end;
      end;
end;



Он попадает в case ! выводит тестовое сообщение! А как проверить передается сообщение или нет!?!?
PM MAIL   Вверх
Демо
Дата 17.10.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот 100%-работающий пример.
Сравни со своим кодом...

Код

unit ufIconTray;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
  ShellApi,dialogs;

var
  WM_MyNotifyIcon: Cardinal;

type

  TfIconTray = class(TForm)

    //PopUp-меню, всплывающее при клике на иконку
    pmIconTray: TPopupMenu;

    //Пункты меню
    pmIconTrayRestore: TMenuItem;       //Восстановление приложения
    pmIconTrayExit: TMenuItem;          //Завершение программы
    pmIconTrayNoAction: TMenuItem;      //Фиктивный пункт меню

    procedure FormCreate(Sender: TObject);
    procedure IconTray(aAction: Cardinal);    //Процедура для манипуляций с иконкой в SysTray
    procedure pmIconTrayRestoreClick(Sender: TObject);
    procedure pmIconTrayExitClick(Sender: TObject);
    procedure MyWndProc(var Message: TMessage);
    procedure FormShow(Sender: TObject); 
  end;

var
  fIconTray: TfIconTray;

implementation

{$R *.dfm}

procedure TfIconTray.FormCreate(Sender: TObject);
var
  UniqueStr: String;
begin
  Application.Title := Self.Caption;
  UniqueStr := Application.Title+IntToStr(Application.Handle);
//Получаем уникальный номер Windows-сообщения.
  WM_MyNotifyIcon := RegisterWindowMessage(PChar(UniqueStr));
//Заменяем обработчик стандартный обработчик сообщений на наш
  WindowProc := MyWndProc;
//  Application.OnMinimize :=  AppOnMinimize;
end;

procedure TfIconTray.MyWndProc(var Message: TMessage);
var
  P: TPoint;
begin
  //Обработка сообщения от иконки в SysTray
  if Message.Msg = WM_MyNotifyIcon then
  begin
    case Message.LParam of

      WM_LBUTTONDBLCLK :
        begin
          //Восстанавливаем приложение
          ShowWindow(Application.Handle,SW_RESTORE);
          //Восстанавливаем основную форму
          ShowWindow(Application.MainForm.Handle,SW_RESTORE);
          //Приложение - на передний план
          SetForegroundWindow(Application.MainForm.Handle);
          //Удаляем иконку
          IconTray(NIM_DELETE);
        end;
      //Клик на правой кнопке мыши
      WM_RBUTTONUP:
      begin
        //Считываем позицию курсора на экране
        GetCursorPos(P);
        //Показываем меню в позиции курсора
        SetForegroundWindow(Application.MainForm.Handle);
        pmIconTray.Popup(P.X, P.Y);
      end;
    end;
    //Заканчиваем обработку
    Message.Result := 0;
    Exit;
  end;
  //Обработка нажатия на кнопку свернуть в заголовке окна

  if (Message.Msg=WM_SYSCOMMAND) and
     (Message.wParam = SC_MINIMIZE) then
  begin
    //Добавляем иконку
    IconTray(NIM_ADD);
    //Скрываем основную форму
    ShowWindow(Application.MainForm.Handle,SW_HIDE);
    //Скрываем приложение
    ShowWindow(Application.Handle,SW_HIDE);
    //Заканчиваем обработку
    Message.Result := 0;
    Exit;
  end;
  //Не наше сообщение - вызываем стандартную процедуру окна
  WndProc(Message);
end;

//Процедура для манипуляций с иконкой
procedure TfIconTray.IconTray(aAction: Cardinal);
var
  nid: TNotifyIconData;
begin
//Заполнение структуры
  nid.cbSize := SizeOf(TNotifyIconData);    //Размер структуры
  nid.Wnd := Self.Handle;                   //Окно назначения
  nid.uID := 0;                             //Назначаем идентификатор иконке
  nid.uCallBackMessage := WM_MyNotifyIcon;  //Процедура для обработки сообщений
  nid.hIcon := Application.Icon.Handle;     //Это основная иконка приложения
  StrPCopy(nid.szTip,Application.Title);    //Всплывающая подсказка (Hint)
//Признаки:
//  NIF_ICON    - используется поле nid.hIcon
//  NIF_MESSAGE - используется сообщение с номером nid.uCallBackMessage для обработки
//  NIF_TIP     - для иконки назначен Hint - всплывающая подсказка.
  nid.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  case aAction of
    NIM_ADD:  Shell_NotifyIcon(NIM_ADD, @nid);        //Добавление иконки
    NIM_DELETE:  Shell_NotifyIcon(NIM_DELETE, @nid);  //Удаление иконки
    NIM_MODIFY:  Shell_NotifyIcon(NIM_MODIFY, @nid);  //Модификация иконки
  end;
end;

//Обработка при выборе пункта меню "Восстановить"
procedure TfIconTray.pmIconTrayRestoreClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
  PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
end;

//Обработка при выборе пункта меню "Выход из программы"
procedure TfIconTray.pmIconTrayExitClick(Sender: TObject);
begin
//Посылаем нашему окну сообщение WM_LBUTTONDBLCLK
  PostMessage(Application.MainForm.Handle,WM_MyNotifyIcon,0,WM_LBUTTONDBLCLK);
//Закрываем приложение
  Application.MainForm.CLose;
end;

procedure TfIconTray.FormShow(Sender: TObject);
begin
  if not Boolean(Tag) then
  begin
    Form2.Show;
    Tag := 1;
  end;
end;

end.




--------------------
    
PM MAIL ICQ Skype   Вверх
shatalinalex
Дата 18.10.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Демо, спасибо разобрался! Заработало ! Всем кто помогал в этой теме тоже огромное спасиба!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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