Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CallbackMessage TNotifyIconData (https://www.delphipraxis.net/105576-callbackmessage-tnotifyicondata.html)

Desmulator 24. Dez 2007 23:43


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:
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;
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.

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:
while not Application.Terminated do begin


end;
Naja danke für eure Hilfe vorab!

ManfredG 25. Dez 2007 08:13

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:
//******************************************************************************
// 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
//******************************************************************************
frohe weihnachten alle
manfred

sirius 25. Dez 2007 09:35

Re: CallbackMessage TNotifyIconData
 
Zitat:

Zitat von Desmulator
Und es läuft wärend dessen eine Schleife dauerhaft... ich mal dass das auch nicht schlimm ist...
Delphi-Quellcode:
while not Application.Terminated do begin


end;
Naja danke für eure Hilfe vorab!

Delphi-Quellcode:
while not Application.Terminated do begin
  Application.processMessages; //find ich allerdings nicht besonders sauber
 
end;

Desmulator 25. Dez 2007 10:09

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

ManfredG 25. Dez 2007 10:41

Re: CallbackMessage TNotifyIconData
 
wie verwendest du denn deine unit?

Desmulator 25. Dez 2007 18:07

Re: CallbackMessage TNotifyIconData
 
Ja das ist ganz einfach:

Delphi-Quellcode:
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
Warum willst du das wissen? Es geht doch eigendlcih nur um die Message die nicht ankommt/abgesendet wird...

ManfredG 25. Dez 2007 21:28

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

Desmulator 26. Dez 2007 09:56

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:
type
 TTaskBarIcon = class(TObject)
   private
    Form: TForm;
  ...

constrctor TaskBarIcon.Create(...);
begin
...
Form := TForm.Create(Application.Owner);
...
end;
Dann übergebe ich noch das handle...

Naja werds mal aufprobieren, bin atm nicht zu hause^^

ManfredG 26. Dez 2007 12:06

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 10:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz