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

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

Проблемы клика по моей иконке в трэе [D7, Win2k]


Denizzz ©   (2004-06-17 12:18:00) 

Привет всем.
Моя программа сворачивается в трэй.
Но при кликании по ней не только появляется окно моего приложения, но и эмулируется нажатие иконки находившейся в тот момент рядом с моей.
Как решить такую проблему?


Denizzz   (2004-06-18 07:43:00) [1]

Mim1Большое thanks!


grom   (2004-06-17 18:31:00) [2]

http://www.delphiworld.ru/index.php?stat&page=2
---------------------
Секреты иконки в системной трее. Часть 1
Автор: Рустик, Просмотров: 234
Этой статьей я начну свой расскаж о секретах работы с иконкой приложения в системной трее. Эта часть расскажет вам о самом самом начальном: как добавлять/изменять/удалять иконку в трей. А также менять ее параметры во время работы приложения.
---------------------------
Секреты иконки в системной трее. Часть 2
Автор: Рустик, Просмотров: 242
Логическое продолжение предыдущей статьи.


Mim1   (2004-06-17 17:51:00) [3]


> procedure TFMain.WMIconNotify(var Message:TMessage);
> var PT: TPoint;
> begin
>   if (Message.LParam=WM_LBUTTON UP) then
>   begin


Mim1   (2004-06-17 17:50:00) [4]

Дело в том что в рядомстоящей иконке происходит действие на событие wm_mouseup. А при нажатии по вашей эконке вы ее удаляете сразу. Выходов два, либо делайте postmessage своемуу приложению и удаляете свою эконку в обработчике этого события (может и не сработать), либо перевесте событие с down на up (либо удаляйте иконку в up событии).


MIA   (2004-06-17 15:46:00) [5]

Может поможет :)

procedure Add_ico(index: Integer);
begin
 FWindowHandle := Classes.AllocateHWnd(Form1.WindowProc);
 Icon1 := TIcon.Create;
 Unit1.Form1.ImageList1.GetIcon(index, Icon1);
 NotifyIconData.cbSize := sizeof(NotifyIconData);
 NotifyIconData.Wnd := FWindowHandle;
 NotifyIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
 NotifyIconData.uCallbackMessage := WM_USER + 101;
 NotifyIconData.hIcon := Icon1.Handle;
 StrPLCopy(NotifyIconData.szTip, 'Чат КНП+MIA', sizeof(NotifyIconData.szTip));
 Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
end;

procedure TForm1.WindowProc(var Message: TMessage);
begin
 begin
   with TMessage(Message) do
     if Msg = WM_USER + 101 then
       with TWMMouse(Message) do
         begin
           GetCursorPos(FInternal);
           case LParam of
             WM_LBUTTONDOWN:
               begin
                 Caption := 'WM_LBUTTONDOWN';
               end;
             WM_LBUTTONUP:
               begin
                 Caption := 'WM_LBUTTONUP';
               end;
             WM_LBUTTONDBLCLK:
               begin
                 Caption := 'WM_LBUTTONDBLCLK';
               end;
             WM_MBUTTONDOWN:
               begin
                 Caption := 'WM_MBUTTONDOWN';
               end;
             WM_MBUTTONUP:
               begin
                 Caption := 'WM_MBUTTONUP';
               end;
             WM_MBUTTONDBLCLK:
               begin
                 Caption := 'WM_MBUTTONDBLCLK';
               end;
             WM_MOUSEMOVE:
               begin
                 Caption := 'WM_MOUSEMOVE';
               end;
             WM_RBUTTONDOWN:
               begin

                 Caption := 'WM_RBUTTONDOWN';
               end;
             WM_RBUTTONUP:
               begin
                 PopupMenu1.Popup(FInternal.X, FInternal.Y);
                 Application.ProcessMessages;
                 Caption := 'WM_RBUTTONUP';
               end;
             WM_RBUTTONDBLCLK:
               begin
                 Caption := 'WM_RBUTTONDBLCLK';
               end;
           end;
         end
     else
       Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);

 end;
end;

Вот... :)


Denizzz   (2004-06-17 13:33:00) [6]

Код выглядит у меня так:
procedure TFMain.WMIconNotify(var Message:TMessage);
var PT: TPoint;
begin
  if (Message.LParam=WM_LBUTTONDOWN) then
  begin
  if Dis=False then FMain.OnCreate(FMain);
  FMain.Show;
  Timer1.Enabled:=False;
  FNID.uFlags:=0;
  Shell_NotifyIcon(NIM_DELETE,@FNID);
  FHI.Free;
  end;
  if (Message.LParam=WM_RBUTTONDOWN) then
  begin
  if Ding='1' then N3.Checked:=True else N3.Checked:=False;
  if Shows='1' then N4.Checked:=False else N4.Checked:=True;
  if Clr='1' then N7.Checked:=True else N7.Checked:=False;
  SetForegroundWindow(Handle);
  GetCursorPos(PT);
  PopupMenu1.Popup(PT.X,PT.Y);
  PostMessage(Handle, WM_NULL, 0, 0);
  end;
end;


Наверх

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