AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Systray-Icon in eigener Klasse

Ein Thema von mika · begonnen am 7. Jun 2005 · letzter Beitrag vom 8. Jun 2005
 
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#19

Re: Systray-Icon in eigener Klasse

  Alt 8. Jun 2005, 11:02
Na alsooooo jetzt hab ichs

mein Fehler war das ich beim erstellen des Icons als Handle das Handle der Applikation
angegeben habe nicht das Handle das ich bei newCreate für den MessageHandler ermittelt habe!

Hier noch mal der Code falls den jemand braucht, ich fang jetzt an da mal n bisschen
Funktionalität einzubasteln


Und dank an alle die sich mit mir bemüht haben

Delphi-Quellcode:
(* *****************************************************************************
  Datum der Erstellung := 07-06-2005
  Datum der letzten Änderung := 07-06-2005

  Unit mit Methoden um ein Icon in der Trayleiste zu plazieren und
  auf dessen Ereignisse zu achten.
***************************************************************************** *)

unit uSystray;

interface

uses ShellApi, Windows, Messages, Forms, Menus, Classes, StdCtrls;

Type
  TSystrayIcon = Class

    FHandle: Cardinal;
    FOldWndProc: TWndMethod;
    FTaskbarEvent: Cardinal;
    FTaskbarCreated: Cardinal;

    FTrayicon: TNotifyIconData;
    FTrayDescription: String;
    FPopupMenu: TPopupMenu;

    Constructor newCreate(IconHint: String);
    Destructor newDestroy;

    private
      Procedure MessageHandler(Var Msg: TMessage);
      Procedure AddIconToSystray(Description: String);
      Procedure RemoveIconFromSystray;
  end;

implementation

(* *****************************************************************************
  Datum der Erstellung := 07-06-2005
  Datum der letzten Änderung := 07-06-2005

  Erzeugt ein Objekt der Klasse und erstellt das Icon im Systray,
  falls der Explorer abstürzt wird das Icon beim Start wieder hergestellt.
***************************************************************************** *)

Constructor TSystrayIcon.newCreate(IconHint: String);
Begin
  Inherited Create;
  FHandle := AllocateHWnd(MessageHandler);
  FTaskbarEvent := RegisterWindowMessage('SystrayCallback');
  FTaskbarCreated := RegisterWindowMessage('TaskbarCreated');
  FTrayDescription := IconHint;
  AddIconToSystray(FTrayDescription);
End;

(* *****************************************************************************
  Datum der Erstellung := 07-06-2005
  Datum der letzten Änderung := 07-06-2005

  Zerstört das Objekt und entfernt das Icon aus dem Systray
***************************************************************************** *)

Destructor TSystrayIcon.newDestroy;
Begin
  DeallocateHWnd(FHandle);
  RemoveIconFromSystray;
  Inherited Destroy;
End;

(* *****************************************************************************
  Datum der Erstellung := 07-06-2005
  Datum der letzten Änderung := 07-06-2005

  Reagiert auf Mausklicks auf das Trayicon und zeigt ein
  Menü an bei Rechtsklick
***************************************************************************** *)

Procedure TSystrayIcon.MessageHandler(Var Msg: TMessage);
Var
  ptCursor: Tpoint;

Begin
  if Msg.Msg = FTaskbarEvent then
  begin
    If Msg.LParam = WM_RBUTTONDOWN then
    begin
      GetCursorPos(ptCursor);
      if Assigned(FPopupMenu) then
        FPopupMenu.Popup(ptCursor.X, ptCursor.Y);
    end
    else If Msg.LParam = WM_LBUTTONDOWN then
    begin
      MessageBox(Application.Handle, 'Test', 'test', MB_OK)
    end;
  end
  else if Msg.Msg = FTaskbarCreated then
  begin
    AddIconToSysTray(FTrayDescription);
  end;
End;

(* *****************************************************************************
  Datum der Erstellung := 07-06-2005
  Datum der letzten Änderung := 07-06-2005

  Fügt dem Systray ein neues Icon hinzu das auf Mausklicks reagiert um
  ein Menü anzuzeigen.
***************************************************************************** *)

Procedure TSystrayIcon.AddIconToSystray(Description: String);
begin
  Fillchar(FTrayicon.szTip, SizeOf(FTrayicon.szTip), 0);

  Move(Description[1], FTrayicon.szTip, Length(Description));
  FTrayicon.cbSize := SizeOf(FTrayicon);
  FTrayicon.Wnd := FHandle;
  FTrayicon.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
  FTrayicon.hIcon := Application.Icon.Handle;
  FTrayicon.uCallbackMessage := FTaskbarEvent;
  FTrayicon.uID := 27787552;

  Shell_NotifyIcon(NIM_DELETE, @FTrayicon);
  Shell_NotifyIcon(NIM_ADD, @FTrayicon);
end;

(* *****************************************************************************
  Datum der Erstellung := 07-06-2005
  Datum der letzten Änderung := 07-06-2005

  Entfernt das Trayicon aus dem Systray.
***************************************************************************** *)

Procedure TSystrayIcon.RemoveIconFromSystray;
Begin
  Shell_NotifyIcon(NIM_DELETE, @FTrayicon);
End;

end.
:: don't Panic ::
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz