![]() |
function aufrufen von der nur das Handle bekannt ist
Hallo,
eine Anwendung will ihr Icon in den Systray stecken. Hierbei übermittelt es die Daten mit folgendem Code:
Code:
Der komplette Codee steht unter
procedure OnMessage(var Msg: TMessage); virtual;
... FillChar(fData, SizeOf(fData), 0); fData.cbSize := SizeOf(fData); fData.Wnd := AllocateHwnd(OnMessage); // handle to get notification message fData.uCallbackMessage := WM_CALLBACK_MESSAGE; fData.hIcon := Icon.Handle; // icon to display StrPLCopy(fData.szTip, Application.Title, SizeOf(fData.szTip) - 1); fData.uFlags := Nif_Icon or Nif_Message; if Application.Title <> '' then fData.uFlags := fData.uFlags or Nif_Tip; if not Shell_NotifyIcon(NIM_ADD, @fData) then // add it raise EOutOfResources.Create('Cannot create shell notification icon'); ![]() Wie kann ich nun von meiner Anwendung aus, in der ich nur die beiden Daten fData.Wnd := AllocateHwnd(OnMessage); fData.uCallbackMessage := WM_CALLBACK_MESSAGE; auf die Funktion zugreifen, die mir in fData.Wnd übergeben wurde, um diese auszuführen? Gruß Helen |
Re: function aufrufen von der nur das Handle bekannt ist
Das geht folgendermaßen:
Delphi-Quellcode:
var
AControl: TWinControl; begin {...} AControl := FindControl(fData.Wnd); if Assigned(AControl) then AControl.WindowProc(WM_WHATYOUWANT); {...} end; |
Re: function aufrufen von der nur das Handle bekannt ist
Hallo,
@Stevie: Danke for Deinen Code. Ich habe ihn ausprobiert. Das Problem ist, dass er bei AControl := FindControl(fData.Wnd); nil zurückgibt. Selbst, wenn die funktion in der selben Anwendung steht, wie hier:
Code:
funktioniert es nicht...
procedure TForm1.Click (Sender : TObject);
var AControl : TWinControl; tmp : HWND; msg : TMessage; begin tmp := AllocateHwnd(OnMessage); AControl := FindControl (tmp); msg.Msg := WM_HELP; if assigned (AControl) then AControl.WindowProc (msg); end; Wieso liefert FindControl immer nil? :wall: |
Re: function aufrufen von der nur das Handle bekannt ist
FindControl erwartet, dass eine VCL-Kapselung um das mit hWnd spezifizierte Window existiert...
in diesem Fall würde ich VCL umgehen, und direkt mit dem Win-API SendMessage arbeiten...
Delphi-Quellcode:
SendMessage(fData.Wnd,fData.uCallbackMessage,<w-parameter>,<l-parameter>);
|
Re: function aufrufen von der nur das Handle bekannt ist
Ich habe jetzt
Code:
ausprobiert. Das interessiert die Kiste überhaupt nicht. Es schwint fast so, als würde diese Nachricht nirgends ankommen. :wall:
SendMessage (fdata.WND,
fdata.uCallBackMSG, WM_LBUTTONDOWN, WM_LBUTTONDOWN); Was kann denn in fdata.WND noch gespeichert sein? |
Re: function aufrufen von der nur das Handle bekannt ist
noch sehe ich nicht ganz klar: wer soll wem eine Message senden ?
soll deine Applikation die Tray-Icons darstellen (anstelle vom Explorer) ? aber sicher ist: mit AllocateWnd wird ein Window-Handle erzeugt, mit der zugehörigen Message-Handler-Methode |
Re: function aufrufen von der nur das Handle bekannt ist
Um mal was klar zu Stellen: Funktionen haben kein Handle. Sie haben innerhalb des Compilats nur eine Sprungadresse. zu der beim Aufruf der Funktion im Code gesprungen wird.
|
Re: function aufrufen von der nur das Handle bekannt ist
Zitat:
|
Re: function aufrufen von der nur das Handle bekannt ist
Zitat:
Fängst du den API Aufruf ab? Es gibt verschiedene Möglichkeiten an die Handles zu kommen. Schreib doch mal bitte ganz klar und deutlich was du vorhast. |
Re: function aufrufen von der nur das Handle bekannt ist
Hallo,
@Sprint: Zitat:
Was ich bereits geschafft habe ist das Abfangen der function Shell_NotifyIcon. Ich habe alle Daten extrahiert und schon den Tipp und das Icon für meine Zwecke benutzenen können. Alle Veränderungen die mittels Shell_NotifyIcon gemacht werden, werden schon in meiner eigenen Leiste (keinen Bezug mehr zum Explorer systray) angezeigt. Das Problem, welches ich derzeit habe ist, die Nachrichten MouseMove, MouseDown, Mouseup, Mousedblclick bei anclicken, mit der Maus überfahren, etc des Icons an die Anwendung weiterzugeben, damit diese dann darauf reagieren kann (Popupmenü,...). Das, was ich von der Anwendung weiß, ist ein Handle, nämlich das hier:
Code:
Ein Handle, um die Notification Messages zu empfangen. Onmessage ist eine Procedure in der Koponente für das Systray Icon. Wie kann jedoch jetzt ein Handle einer Procedure übergeben werden? Procedures haben schließlich kein Handle. Also stellt sich nun die Frage, was ist in der Variablen fdata.wnd gespeichert?
fData.Wnd := AllocateHwnd(OnMessage); // handle to get notification message
Und wie kann ich dem Programm, welches sein Icon in den Systray eingetragen hat mitteilen, das der Nutzer auf sein Icon geclickt hat. Gruß Helen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 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