(* *****************************************************************************
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.