![]() |
CallbackMessage TNotifyIconData
HalliHallo
Bevor ich anfange zu texten erst einmal allen Frohe Weihnachten :roll: ... Naja also es geht um Messages und um das Icon in der SysTray... Folgender Code:
Delphi-Quellcode:
Eigendlich müsste ja testweise bei einem Klick auf das Icon die Nachricht "klick" angezeigt werden, aber das passier nicht. Ich weiß nicht sowarn es liegt, die namen habe ich auch schon tausendmal kontrolliert, es stimmt allse.
const
WM_TASKBARICON = WM_USER + 0; { Wichtige Message } ... type TTaskBarIcon = class(TObject) private ... //MessageFunktion procedure WMTaskbarEvent(var Msg: TMessage); message WM_TASKBARICON; ... IcoData.uCallbackMessage := WM_TASKBARICON; ... procedure TTaskBarIcon.WMTaskbarEvent(var Msg: TMessage); var Point: TPoint; begin showmessage('klick'); try case Msg.LParamLo of WM_LBUTTONDOWN: begin if Assigned(OnClick) then OnClick(); end; WM_RBUTTONDOWN: begin SetForegroundWindow(FOwner); GetCursorPos(Point); FPopupMenu.popup(Point.X,Point.Y); end; end; except //Fehler: nichts end; end; Zur Info: das ganze ist in einer selbstgeschriebnen Unit. Ka ob das was damit zu tun hat, glaube net... Und es läuft wärend dessen eine Schleife dauerhaft... ich mal dass das auch nicht schlimm ist...
Delphi-Quellcode:
Naja danke für eure Hilfe vorab!
while not Application.Terminated do begin
end; |
Re: CallbackMessage TNotifyIconData
ich denke du mußt windows noch sagen, wie es deine botschaft zu verwenden hat
und zwar durch aufruf von TaskBarAddIcon
Delphi-Quellcode:
frohe weihnachten alle
//******************************************************************************
// TASKBAR procedure TaskBarAddIcon; var tnid : TNOTIFYICONDATA; begin tnid.cbSize := sizeof(TNOTIFYICONDATA); tnid.Wnd := HF.Handle; tnid.uID := 1; tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; tnid.uCallbackMessage := WMU_TASKBAREVENT; tnid.hIcon :=HF.IconImg.picture.icon.handle; strcopy(tnid.szTip,'Outlookmodul'); Shell_NotifyIcon(NIM_ADD, @tnid); end; procedure TaskBarRemoveIcon; var tnid : TNOTIFYICONDATA ; begin tnid.cbSize := sizeof(TNOTIFYICONDATA); tnid.Wnd := HF.Handle; tnid.uID := 1; Shell_NotifyIcon(NIM_DELETE, @tnid); end; procedure TaskBarChgTip(Tip: string); var tnid : TNOTIFYICONDATA ; begin tnid.cbSize := sizeof(TNOTIFYICONDATA); tnid.Wnd := HF.Handle; tnid.uID := 1; tnid.uFlags := NIF_TIP; strcopy(tnid.szTip,pChar(Tip)); if not Shell_NotifyIcon(NIM_MODIFY, @tnid) then ShowMessage('Modifikation falsch'); end; // TASKBAR //****************************************************************************** manfred |
Re: CallbackMessage TNotifyIconData
Zitat:
Delphi-Quellcode:
while not Application.Terminated do begin
Application.processMessages; //find ich allerdings nicht besonders sauber end; |
Re: CallbackMessage TNotifyIconData
@ManfredG : ich weiß nicht was du meinst, ich habe eine extra unit für das icon geschrieben, die alles kann... nur bei der message hackts noch was...
@sirius: hm... geht trozdem nicht |
Re: CallbackMessage TNotifyIconData
wie verwendest du denn deine unit?
|
Re: CallbackMessage TNotifyIconData
Ja das ist ganz einfach:
Delphi-Quellcode:
Warum willst du das wissen? Es geht doch eigendlcih nur um die Message die nicht ankommt/abgesendet wird...
var
Ico: TTaskBarIcon; ... Ico := TTaskBarIcon.Create(Application.Handle,'C:/beispiel.ico'); //Ab hier ist das Iocn in der Leiste Ico.ToolTipp := 'Das ist ein Beispiel'; //Ab hier wird nun auch noch der ToolTipp angezeigt ... Ico.Destroy; //Das Icon is wieder weg |
Re: CallbackMessage TNotifyIconData
Ich wollte wissen, mit welchem handle du dein objekt initialisierst.
Bin mir nicht ganz sicher, aber das problem liegt wohl darin, daß du an windows "Application.Handle" übergibst. In TNOTIFYICONDATA wird windows mitgeteilt, wohin die botschaften gehen sollen und es wird ein Fenster-Handle verlangt. Die botschaft WM_TASKBARICON wird dann an das fenster geschickt, dessen Handle du übergeben hast. Dein objekt ist aber kein fenster und kann deshalb keine botschaft empfangen, deshalb reagiert die botschaftsfunktion dort nicht. Entweder du änderst TTaskBarIcon in eine Class wie TForm, damit dort ein Fenster-Handle verfügbar ist (kann ja unsichtbar sein) oder du legst die Botschaftsfunktion in das Hauptfenster, was weniger gut ist, weilt du dann das objekt imer benachrichtigen müßtest und das widerspricht dem sinn. vielleicht hat jemand eine idee, wie man das einfach machen kann. gruß manfred |
Re: CallbackMessage TNotifyIconData
Hm.. du meinst also, dass ich ein unsichbares fenster in der Instanz erzeugen soll, von dem der handle übergeben werden soll.
Delphi-Quellcode:
Dann übergebe ich noch das handle...
type
TTaskBarIcon = class(TObject) private Form: TForm; ... constrctor TaskBarIcon.Create(...); begin ... Form := TForm.Create(Application.Owner); ... end; Naja werds mal aufprobieren, bin atm nicht zu hause^^ |
Re: CallbackMessage TNotifyIconData
nein, mehr in der form:
Delphi-Quellcode:
const WM_TASKBARICON = WM_USER+nnn;
type TTaskBarIcon = class(TWinControl) private procedure WMTaskbarEvent(var Msg: TMessage); message WM_TASKBARICON; ... constructor TaskBarIcon.Create(AOwner: TComponent); var tnid : TNOTIFYICONDATA; begin inherited Create(AOwner); Visible := FALSE; tnid.cbSize := sizeof(TNOTIFYICONDATA); tnid.Wnd := Self.Handle; tnid.uID := 1; tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP; tnid.uCallbackMessage := WM_TASKBARICON; tnid.hIcon :=Application.MainForm.IconImg.picture.icon.handle; strcopy(tnid.szTip,'ProgName'); Shell_NotifyIcon(NIM_ADD, @tnid); ... end; procedure TaskBarIcon.WMTASKBAREVENT(var message: TMessage); var point : TPoint; begin case message.LParamLo of WM_LBUTTONDOWN : begin Application.MainForm.Show; // so ungefähr end; WM_RBUTTONDOWN : begin GetCursorPos(point); PM_Task.PopUp(point.x,point.y); // z.B. ein PopUp-Menü end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 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