Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi function aufrufen von der nur das Handle bekannt ist (https://www.delphipraxis.net/29204-function-aufrufen-von-der-nur-das-handle-bekannt-ist.html)

helen 5. Sep 2004 15:23


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:
    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');
Der komplette Codee steht unter http://www.swissdelphicenter.ch/de/showcode.php?id=1303

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

Stevie 6. Sep 2004 15:48

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;

helen 7. Sep 2004 18:24

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:
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;
funktioniert es nicht...

Wieso liefert FindControl immer nil? :wall:

Basilikum 7. Sep 2004 19:10

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>);

helen 8. Sep 2004 18:20

Re: function aufrufen von der nur das Handle bekannt ist
 
Ich habe jetzt
Code:
SendMessage (fdata.WND,
             fdata.uCallBackMSG,
             WM_LBUTTONDOWN,
             WM_LBUTTONDOWN);
ausprobiert. Das interessiert die Kiste überhaupt nicht. Es schwint fast so, als würde diese Nachricht nirgends ankommen. :wall:

Was kann denn in fdata.WND noch gespeichert sein?

Basilikum 8. Sep 2004 18:44

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

Luckie 8. Sep 2004 18:48

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.

Assarbad 8. Sep 2004 22:00

Re: function aufrufen von der nur das Handle bekannt ist
 
Zitat:

Zitat von Luckie
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.

Naja, manche haben auch ein Handle ... als Parameter *duck-und-weg*

Sprint 8. Sep 2004 22:18

Re: function aufrufen von der nur das Handle bekannt ist
 
Zitat:

Zitat von helen
Heine Anwendung will ihr Icon in den Systray stecken. Hierbei übermittelt es die Daten mit folgendem Code:

Woher willst du das wissen, das die Anwendung das macht? (1000 Weg führen nach Rom. Muss ja nicht immer alles über Shell_NotifyIcon gehen)
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.

helen 9. Sep 2004 19:36

Re: function aufrufen von der nur das Handle bekannt ist
 
Hallo,

@Sprint:
Zitat:

Woher willst du das wissen, das die Anwendung das macht? (1000 Weg führen nach Rom. Muss ja nicht immer alles über Shell_NotifyIcon gehen)
Ich habe mir 3 unterschiedliche Objecte angeschaut, mit denen ein Icon in den Systray gezaubert wird und das Prinzip war bei allen gleich. Daraus habe ich gefolgert (nicht mathematisch korrekt, ich weiß aber für den Beweis mit Vollständiger Induktion viel mir nix ein :-D), das dies das Prinzip für Icons im Systray sein muss.

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:
fData.Wnd := AllocateHwnd(OnMessage); // handle to get notification message
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?
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.
Seite 1 von 2  1 2      

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