Einzelnen Beitrag anzeigen

Benutzerbild von mika
mika

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

Re: Systray-Icon in eigener Klasse

  Alt 7. Jun 2005, 15:54
Hab mir da jetzt was zusammengebastelt das sich auch kompilieren lässt

Allerdings wenn ich mit der Maus auf mein Symbol klicke gibt er in Msg.Msg einen
anderen Code an als den den ich in WM_TASKBAREVENT durch das RegisterWindowMessage
bekommen habe: Will heissen er springt in der CallbackProzedur nicht in den richtigen
Teil der If Abfrage.

Hier mal mein jetziger Code:

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;

Const
  FMyCallbackMessage = 'TSystrayCallback';

Type
  TSystrayIcon = Class

    FHandle: THandle;
    WM_TASKBAREVENT: Cardinal;
    WM_TASKBARCREATED: 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);
  WM_TASKBAREVENT := RegisterWindowMessage(fMyCallbackMessage); // Hier bekomme ich einen
  // Wert von 49774 zurück
  WM_TASKBARCREATED := 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

  Reagiiert 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 = WM_TASKBAREVENT then // Wenn ich mit der Maus auf mein Symbol klicke
  // Bekomme ich in Msg.Msg den Wert 28 zurück :(
  begin
    GetCursorPos(ptCursor);
    if Assigned(FPopupMenu) then
      FPopupMenu.Popup(ptCursor.X, ptCursor.Y);
  end
  else if Msg.Msg = WM_TASKBARCREATED 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 := Application.Handle;
  FTrayicon.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE;
  FTrayicon.hIcon := Application.Icon.Handle;
  FTrayicon.uID := 27787552;
  FTrayicon.uCallbackMessage := WM_TASKBAREVENT;

  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