AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi An die Daten von PNotifyIconData herankommen
Thema durchsuchen
Ansicht
Themen-Optionen

An die Daten von PNotifyIconData herankommen

Ein Thema von helen · begonnen am 17. Mai 2004 · letzter Beitrag vom 22. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
helen

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

An die Daten von PNotifyIconData herankommen

  Alt 17. Mai 2004, 10:06
Hallo,

kann ich das Icon aus dem Datensegment PNotifyIconData in ein TImage laden?
Was wird in uCallback, uFlags und uID gespeichert?

Welche Möglichkeit gibt es, das Object von einer dll aus an ein Programm zu senden? Außer per Netzwerk-Socket.

Gruß Helen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: An die Daten von PNotifyIconData herankommen

  Alt 17. Mai 2004, 11:27
Zitat von helen:
kann ich das Icon aus dem Datensegment PNotifyIconData in ein TImage laden?
PNotifyIconData ist eine Datenstruktur (=Record), die deine Anwendung oder DLL bereitstellen muss
um damit die Funktion Shell_NotifyIcon aufzurufen.
Normalerweise wird das Icon mit der Funktion LoadIcon aus den Resourcen der Anwendung/DLL geladen.
Um vom Icon-Handle zum Image zu kommen sind folgende Schritte erforderlich:
Delphi-Quellcode:
var
   i : TIcon;
   h : HICON;
begin
   i := TIcon.Create;
   h := LoadIcon(HInstance, 'MAINICON'); // lade ein Icon(handle)
   i.Handle := h;
   Image1.Picture.Assign(i); // gib das Icon an das Image
   i.Free; // wird nicht mehr gebraucht
end;
Zitat von helen:
Was wird in uCallback, uFlags und uID gespeichert?
Das kann man in der Windows-SDK-Hilfe (Stichwort: NOTIFYICONDATA) nachlesen.
Aber eigentlich braucht dich dies garnicht zu interessieren, da es Komponenten gibt,
die das Thema TNA (Task Notification Area) abdecken.
Torry's->Tray Icons
Zitat von helen:
Welche Möglichkeit gibt es, das Object von einer dll aus an ein Programm zu senden? Außer per Netzwerk-Socket.
Wozu??? Wenn du die Icons in einer DLL speichern möchtest, dann gibst du einfach den Parameter
HInstance für die Funktion LoadIcon mit:
Delphi-Quellcode:
  h := LoadLibrary('MyIcons.DLL');
  Iconhandle := LoadIcon(h, 'HAPPYHELEN');
Andreas
  Mit Zitat antworten Zitat
helen

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

Re: An die Daten von PNotifyIconData herankommen

  Alt 17. Mai 2004, 12:45
Danke, shima!

Zitat:
Wozu??? Wenn du die Icons in einer DLL speichern möchtest, dann gibst du einfach den Parameter
HInstance für die Funktion LoadIcon mit:
Ich brauche die andere Richtung... Ich habe eine DLL, mit der die function Shell_NotifyIcon gehookt wird. Jetzt muss ich aber irgendwie die an diese function übergebenen Daten an mein Programm weiterleiten, welches dann das Icon anzeigen soll.

Wie funktioniert der Transport DLL --> Anwendung am besten?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: An die Daten von PNotifyIconData herankommen

  Alt 17. Mai 2004, 13:48
Zitat von helen:
Ich brauche die andere Richtung... Ich habe eine DLL, mit der die function Shell_NotifyIcon gehookt wird. Jetzt muss ich aber irgendwie die an diese function übergebenen Daten an mein Programm weiterleiten, welches dann das Icon anzeigen soll.

Wie funktioniert der Transport DLL --> Anwendung am besten?
OK, jetzt wirds klarer.
Die DLL muss auf irgendeineweise das Ziel (=deine Anwendung) mitgeteilt bekommen.

Mir fallen im Moment 2 Alternativen ein:
- die DLL bekommt von der Anwendung das Handle des Hauptformulars mitgeteilt und muss diese
in einer globalen Variablen speichern.
die DLL benutzt SendMessage(apphandle, WM_COPYDATA, ...) um die Daten an Hauptformular
zu schicken.

- die DLL bekommt von der Anwendung einen Zeiger auf eine Callback-Funktion mitgeteilt
und muss diesen in einer globalen Variablen speichern.
Sobald der Hook Shell_NotifyIcon auftritt, ruft die DLL die Callback-Funktion auf.
Die Anwendung kopiert die Daten und macht diese sichtbar.
Diese Alternative gefällt mir am Besten, da sie klarer und einfacher ist.
Wenn deine DLL nur von Delphi-Anwendungen geladen werden soll, käme auch eine Callback-Methode
in Frage. (siehe auch Nutzung einer Callback-Funktion innerhalb eines Objekts)
Andreas
  Mit Zitat antworten Zitat
helen

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

Re: An die Daten von PNotifyIconData herankommen

  Alt 18. Mai 2004, 11:59
Hallo,

wie kann ich denn den Zeiger auf die Callback-Funktion an die DLL übermitteln?

Das installieren des Hooks funktioniert so:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  InjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'TBNAhook.dll');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  UninjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'TBNAhook.dll');
end;
der Hook selbst sieht so aus:
Code:
library TBNAhook;

uses
  Windows,
  madRemote,
  madCodeHook,
  madStrings,
  ShellAPI,
  dialogs;

var Shell_NotifyIcon : function (dwMessage: DWORD; lpData: PNotifyIconData) : bool; stdcall;
var Shell_NotifyIconA : function (dwMessage: DWORD; lpData: PNotifyIconData) : bool; stdcall;
var Shell_NotifyIconW : function (dwMessage: DWORD; lpData: PNotifyIconData) : bool; stdcall;


function MY_NotifyIcon (dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;
begin
  ShowMessage (lpData.szTip);
  //Form1.AddIcon (dwMessage, @lpData);


  result := true;
end;

function MY_NotifyIconA (dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;
begin
  ShowMessage (lpData.szTip);
  //Form1.AddIcon (dwMessage, @lpData);

  result := true;
end;

function MY_NotifyIconW (dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;
begin
  ShowMessage (lpData.szTip);
  //Form1.AddIcon (dwMessage, @lpData);

  result := true;
end;

begin
  HookAPI('shell32.dll', 'Shell_NotifyIcon', @MY_NotifyIcon, @Shell_NotifyIcon);
  HookAPI('shell32.dll', 'Shell_NotifyIconA', @MY_NotifyIconA, @Shell_NotifyIconA);
  HookAPI('shell32.dll', 'Shell_NotifyIconW', @MY_NotifyIconW, @Shell_NotifyIconW);
end.
Ich habe nun versucht, das Icon aus PNotifyIconData mit
Code:
tmp := TIcon.Create;
tmp.Assign (lpData.hIcon);

ImageIndex := ImageList1.AddIcon (tmp);
in eine ImageList einzufügen, aber das läuft nicht...
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: An die Daten von PNotifyIconData herankommen

  Alt 18. Mai 2004, 14:24
Zitat von helen:
Ich habe nun versucht, das Icon aus PNotifyIconData mit
Code:
tmp := TIcon.Create;
tmp.Assign (lpData.hIcon);

ImageIndex := ImageList1.AddIcon (tmp);
in eine ImageList einzufügen, aber das läuft nicht...
Das müsste aber so heissen:
Delphi-Quellcode:
tmp := TIcon.Create;
try
  tmp.Handle := lpData^.hIcon; // <===
  ImageIndex := ImageList1.AddIcon(tmp);
  if ImageIndex=-1 then // auf jeden Fall prüfen, damit man weiss was Sache ist
     ShowMessage('AddIcon failed !'); // anzeigen oder sonstwie protokollieren
finally
  tmp.Free;
end;
Zitat von helen:
wie kann ich denn den Zeiger auf die Callback-Funktion an die DLL übermitteln?
Nach einigem Nachdenken bin ich zu dem Schluss gekommen, dass eine Callback-Funktion
wohl nicht richtig funktionieren kann:
Deine DLL wird an die DLL Shell32.dll "angeklemmt" und arbeitet somit in verschiedenen
Processräumen (getrennter Speicher).
Also muss deine DLL die Anwendung finden. (Also doch mit FindWindow gefolgt von SendMessage arbeiten)
Andreas
  Mit Zitat antworten Zitat
helen

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

Re: An die Daten von PNotifyIconData herankommen

  Alt 19. Mai 2004, 14:41
Ich habe jetzt wie folgt versucht die Daten von der DLL an die Anwendung weiterzuleiten:

DLL:
Code:
type
  TBNApaket = record
     msg : DWord;
     Data : PNotifyIconData;
  end;

...

function SendData (paket : TBNApaket) : Boolean;
  var aCopyData: TCopyDataStruct;
begin
  with aCopyData do begin
    dwData := 0;
    cbData := Sizeof (paket);
    lpData := @paket;
  end;

  SendMessage(FindWindow('TX11TBNA', nil), WM_COPYDATA, ??Was muss hier herein??, Longint(@aCopyData));
end;

function MY_NotifyIcon (dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;
  var tmp : TBNApaket;
begin
  tmp.msg := dwMessage;
  tmp.Data := lpData;

//  ShowMessage (lpData.szTip);
  SendData (tmp);

  result := true;
end;

Anwendung:
Code:
procedure TX11TBNA.WMCopyData(var Msg: TWMCopyData);
  var tmp : TBNApaket;
begin
  tmp := (Msg.CopyDataStruct.lpData) as TBNApaket;   ??Wie kann ich den zugesandten Pointer wieder einem TBNA Record übergeben??
end;
Gruß Helen
  Mit Zitat antworten Zitat
helen

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

Re: An die Daten von PNotifyIconData herankommen

  Alt 21. Mai 2004, 13:42
Nachdem die Datenübertragung nun einigermaßen funktioniert gibt es Probleme beim Auspacken des Icons:

Code:
function TX11TBNA.ImgList_AddIcon (HIcon : HIcon) : Integer;
  var tmp : TIcon;
begin
  tmp := TIcon.Create;
  try
    tmp.Handle := hIcon; // <===
    result := ImageList1.AddIcon(tmp);
    if result=-1 then   // auf jeden Fall prüfen, damit man weiss was Sache ist
       ShowMessage('AddIcon failed !'); // anzeigen oder sonstwie protokollieren
  finally
    tmp.Free;
  end;
end;


procedure TX11TBNA.WMCopyData(var Msg: TWMCopyData);
  var tmp: TBNApaket; lPtmp: ^TBNApaket;

      lpmsg : DWord;
      lpData : PNotifyIconData;
begin
  lptmp := Msg.CopyDataStruct.lpData;
  tmp := lptmp^;

  lpmsg := tmp.msg;
  lpdata := @tmp.Data;

  AddIcon (lpmsg, lpdata);
end;


function TX11TBNA.AddIcon (dwMessage: DWORD; lpData: PNotifyIconData) : Boolean;
  var i, imgpos : Integer; tmp : TIcon;
begin
  imgpos := -1;
  For i := 0 to Listview1.Items.Count-1 do
      if (StrToInt (Listview1.Items[i].SubItems[0]) = lpData.Wnd) and
         (StrToInt (Listview1.Items[i].SubItems[1]) = lpData.uID) then
         imgpos := I;

  if dwMessage = NIM_ADD then begin
     ShowMessage ('ADD');

     If imgpos < 0 then
        with Listview1.Items.Add do begin
              ImageIndex := ImgList_AddIcon (lpData.hIcon);
              Caption := lpdata.szTip;
              SubItems.Add (IntToStr(lpdata.uID));
              SubItems.Add (IntToStr(lpdata.Wnd));
        end;
  end
  else

  if dwMessage = NIM_MODIFY then begin
     ShowMessage ('Modify');

     If imgpos > -1 then
        with ListView1.Items [i] do begin
             ImageIndex := ImgList_AddIcon (lpData.hIcon);
             Caption := lpdata.szTip;
             SubItems.Add (IntToStr(lpdata.uID));
             SubItems.Add (IntToStr(lpdata.Wnd));
        end
     else
         with Listview1.Items.Add do begin
              ImageIndex := ImgList_AddIcon (lpData.hIcon);
              Caption := lpdata.szTip;
              SubItems.Add (IntToStr(lpdata.uID));
              SubItems.Add (IntToStr(lpdata.Wnd));
        end;
  end
  else

  if dwMessage = NIM_DELETE then begin
     ShowMessage ('Delete');

     If imgpos > -1 then
        ListView1.Items.Delete (imgpos);
  end

  else ShowMessage ('Command not found!');
end;
In der function ImgList_AddIcon scheint Imagelist1.AddIcon immer -1 zurückzugeben... Warum?
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: An die Daten von PNotifyIconData herankommen

  Alt 21. Mai 2004, 13:59
Hi,

ich würde den Parameter in der Prozedur

ImgList_AddIcon (HIcon : HIcon) : Integer; nicht hIcon nennen, da der Typ schon so heisst.

Ansonsten könntest du noch prüfen, ob der Parameter <> 0 ist.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
helen

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

Re: An die Daten von PNotifyIconData herankommen

  Alt 21. Mai 2004, 15:07
Hab das Hicon nun in bicon umbenannt, wie vorgeschlagen. Das Problem ist jedoch, dass bIcon = -1 ist. Wieso?
  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 18:53 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