Problem z TrayIcon...

0

Przeszukałem kilka forum jakie znam, ale na mój problem nie znalazłem wyjaśnienia :(
Od razu zakładam żeby przeczytać cały post, bo możecie mnie nie zrozumieć :(

Mam problem z TrayIcon, chodzi dokładnie oto, aby po uruchomieniu projektu od razu pokazało się okno Form1 i TrayIcon, gdy kliknę prawym przyciskiem myszki na Trayicon to żeby pokazało się PopUpMenu1. To akurat udało mi się zrobić, ale jest problem z PopUpMenu. Dopiero za drugim razem gdy Form1.visible:=true; kliknę myszką to się pokazuje PopUpMenu. A gdy Form1.visible:=false; to wtedy po kliknięciu myszką PopUpMenue pokazuje się za pierwszym razem.

Może jest przez to, że gdy klikam na TrayIcon to okno Form1 staje się nie aktywne... [???]

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.Initialize;
  ExtendedStyle:=GetWindowLong(Application.Handle, GWL_EXSTYLE);
  SetWindowLong(Application.Handle,GWL_EXSTYLE,ExtendedStyle   or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
  with NotifyIconData do begin
    hIcon := Icon.Handle;
    StrPCopy(szTip, Application.Title);
    Wnd := Handle;
    uCallbackMessage := WM_ICONTRAY;
    uID := 1;
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
    cbSize := sizeof(TNotifyIconData);
  end;
  Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
end;

procedure TForm1.Icontray(var Msg: TMessage);
var
  CursorPos : TPoint;
begin

 if Msg.lParam = WM_RBUTTONDOWN then begin
    GetCursorPos(CursorPos);
    PopupMenu4.Popup(CursorPos.x, CursorPos.y);
  end;
  if Msg.lParam = WM_LBUTTONDOWN then
  if form1.Visible=false then show
  else hide;
  end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone;
  Hide;
  Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
end;

Pozdrawiam... i czekam na jakieś odpowiedzi..

0

Prosze pomóżcie mi...bo to mi bardzo potrzeny trayicon.

0

Hmm - trochę nie do tematu, ale ja używam gotowego TJvTrayIcon z pakietu Jedi.. wszystko automatycznie i nie ma problemów - po co coś pisać skoro już jest gotowe i działa wyśmienicie.

0

Po pierwsze to nie wiem dlaczego usuwasz okno z belki tytułowej w FormCreate a nie w pliku programu, po drugie jesli Form1.Visible:=false to Form1.Visible:=true a nie Show, po trzecie to według mnie procedura obslugująca kliknięcie w tray powinna wyglądać tak:

procedure WndProc(var  Msg: TMessage); override;
begin
 ...
end;

, a po czwarte to sprawdzając nacisniecie na tray powinienes też sprawdzac komunikat który był w CallBackMessage. (nie jestem pewien czy komunikat ten nie powinien być: WM_USER+1). :) :P

0

Ok już doszedłem jak to zrobić.. :)
Wystarczy było dodać polecenie:

SetForegroundWindow(Application.MainForm.Handle);

i już...Dzięki za wszystkie odpowiedzi :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1