![]() |
Re: Systray-Icon in eigener Klasse
hab ich auch nicht abgestritten - jedoch ist dieser weg besser als mit den windowprocs von irgendwelchen forms zumzuspieln - find ich :)
|
Re: Systray-Icon in eigener Klasse
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. |
Re: Systray-Icon in eigener Klasse
Hallo Mika,
dann will ich mal ein bisschen klugscheißen :mrgreen: Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Grüße, Marco |
Re: Systray-Icon in eigener Klasse
Zitat:
der rest funktioniert ansonsten prima |
Re: Systray-Icon in eigener Klasse
Zitat:
Zitat:
Zitat:
Zitat:
als den den ich zurückbekomme. Schönen Gruß und Danke für eure Hilfe ich guck mal ob ichs mit den ganzen Tipps hinbekomme, meld mich nachher nochmal. |
Re: Systray-Icon in eigener Klasse
Hmmmmm
nichtsdestotrotz bekomme ich es irgendwie nicht hin das in Msg.Msg der Wert steht den ich mittels RegisterWindow ermittelt und beim erzeugen des Icons in uCallbackMessage eingetragen habe! Das mit dem LParam abfragen ist erst mal nicht so wichtig ich will erstmal nur das er merkt: Ahhh das Icon das angeklickt wurde ist meins also muss ich auch was machen! |
Re: Systray-Icon in eigener Klasse
Hallo mika,
war nich bös gemeint :wink: Zitat:
Delphi-Quellcode:
Wenn das Label beim Überfahren resp. Anklicken des Tray-Icons seine Beschriftung nicht ändert, melde dich nochmal... :nerd:
Label1.Caption := 'Tray Message.';
Gruß, Marco |
Re: Systray-Icon in eigener Klasse
Ich fass sowas auch nciht bös auf ;)
So nu aber nochmal zur Problematik
Delphi-Quellcode:
Er geht in die Prozedur wenn ich auf irgendein(!) Icon in dem Systray klicke, mein Problem
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; ist halt bloss das in Msg.Msg immer 28 drinsteht, egal ob ich auf mein Icon oder das von der Lautstärkeregelung von Windows klicke.... Ergo ist (Msg.Msg = FTaskbarevent) nie TRUE :( |
Re: Systray-Icon in eigener Klasse
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 :D
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. |
Re: Systray-Icon in eigener Klasse
-.-°
auf das newCreate / newDestroy solltest verzichten und stattdessen die methoden "Create" und "Destroy" auch benutzen die schon vorhanden sind, denn sonst würdest du deinen "newDestroy" in etwa direkt aufrufen, und DAS soll man vermeiden...
Delphi-Quellcode:
implementation
public
constructor Create(const AHint: string); destructor Destroy; override; end; und dann hier dementsprechend definieren... ohne dieses "new" davor :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 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 by Thomas Breitkreuz