AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi function aufrufen von der nur das Handle bekannt ist
Thema durchsuchen
Ansicht
Themen-Optionen

function aufrufen von der nur das Handle bekannt ist

Ein Thema von helen · begonnen am 5. Sep 2004 · letzter Beitrag vom 9. Sep 2004
Antwort Antwort
Seite 1 von 2  1 2      
helen

Registriert seit: 8. Mai 2004
42 Beiträge
 
#1

function aufrufen von der nur das Handle bekannt ist

  Alt 5. Sep 2004, 16:23
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 6. Sep 2004, 16:48
Das geht folgendermaßen:
Delphi-Quellcode:
var
  AControl: TWinControl;
begin
  {...}  
  AControl := FindControl(fData.Wnd);
  if Assigned(AControl) then
    AControl.WindowProc(WM_WHATYOUWANT);
  {...}
end;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
helen

Registriert seit: 8. Mai 2004
42 Beiträge
 
#3

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 7. Sep 2004, 19:24
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?
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#4

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 7. Sep 2004, 20:10
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...

SendMessage(fData.Wnd,fData.uCallbackMessage,<w-parameter>,<l-parameter>);
  Mit Zitat antworten Zitat
helen

Registriert seit: 8. Mai 2004
42 Beiträge
 
#5

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 8. Sep 2004, 19:20
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.

Was kann denn in fdata.WND noch gespeichert sein?
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#6

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 8. Sep 2004, 19:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 8. Sep 2004, 19:48
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#8

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 8. Sep 2004, 23:00
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*
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#9

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 8. Sep 2004, 23:18
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
helen

Registriert seit: 8. Mai 2004
42 Beiträge
 
#10

Re: function aufrufen von der nur das Handle bekannt ist

  Alt 9. Sep 2004, 20:36
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 ), 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:45 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