Announcement

Collapse
No announcement yet.

Hook zum abfangen der WM_COPYDATA-Message von Trayicon

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hook zum abfangen der WM_COPYDATA-Message von Trayicon

    Hallo,

    ich habe mittels WinSight festgestellt, dass die Message WM_COPYDATA beim hinzufügen und entfernen von TrayIcons aus der Taskbar gesendet wird. Ich möchte nun diese Message mit meinem Programm verarbeiten und habe herausgefunden das dies nur über Hooks geht. Habe aber noch keinen Lösungsansatz. Könnte mir eventl. jemand mit ein paar Tips weiterhelfen oder vielleicht etwas Quelltext.

    Vielen Dank
    Stefan Heinrich

  • #2
    Hallo Stefan,

    http://www.bendlins.de/nico/delphi/OneInst.zip (Nico's Lösung)
    <pre>
    { Sender - Daten schicken }
    procedure TForm1.Button1Click(Sender: TObject);
    var
    aCopyData : TCopyDataStruct;
    hTargetWnd : hWnd;
    begin
    with aCopyData do begin
    dwData := 0;
    cbData := StrLen(PChar(Edit1.Text)) + 1;
    lpData := PChar(Edit1.Text)
    end;
    // Fenster anhand des Titelzeilentext suchen
    // Search window by the window title
    hTargetWnd := FindWindowEx(0, 0, nil, PChar('WM_CopyData-Empfänger'));
    if hTargetWnd <> 0 then
    SendMessage(hTargetWnd, WM_CopyData, LongInt(Handle), LongInt(@aCopyData))
    else
    ShowMessage('No recipient found');
    end;

    (* ----------------------------------------------------------------*)

    {Recipient - Daten empfangen }
    type
    TForm1 = class(TForm)
    ...
    private
    { Private declarations }
    procedure WMCopyData(var Message: TWMCopyData); message WM_CopyData;
    public
    { Public declarations }
    end;

    procedure TForm1.WMCopyData(var Message: TWMCopyData);
    var
    sText : array[0..99] of Char;
    begin
    // anzuzeigenden Text aus den Parametern generieren
    // generate text from parameter
    StrLCopy(sText, Message.CopyDataStruct.lpData, Message.CopyDataStruct.cbData);
    // Empfangenen Text ausgeben
    // write received text
    Label1.Caption := sText;
    end;
    </pre>(mailto:[email protected])

    TaskBarIcon:
    <pre>
    unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ShellApi;
    const
    WM_TRAYMSG = WM_USER + 99; // User-Message für Tray
    type
    TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    { Private-Deklarationen }
    notiTray: TNotifyIconData;
    procedure TrayMessage(var Message: TMessage); message WM_TRAYMSG;
    public
    { Public-Deklarationen }
    end;
    var
    Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    // NotifyIconData-Struktur installieren...
    with notiTray do begin
    cbSize := SizeOf(notiTray); // Größe der Struktur
    Wnd := Handle; // Handle auf Fenster
    uFlags := NIF_ICON + NIF_MESSAGE + NIF_TIP; // Flags
    uCallBackMessage := WM_TRAYMSG; // Message
    hIcon := Application.Icon.Handle; // Tray-Icon
    szTip := 'Blah blah'; // Tool-Tip
    end; // End With
    Shell_NotifyIcon(NIM_ADD, @notiTray); // Tray-Icon hinzufügen
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Shell_NotifyIcon(NIM_DELETE, @notiTray); // Tray-Icon wieder löschen
    end;
    // Message für das Tray-Icon...
    procedure TForm1.TrayMessage(var Message: TMessage);
    begin
    // z.B. Doppelklick abfangen...
    if Message.LParam = WM_LBUTTONDBLCLK then
    ShowMessage('Doppelklick!'#13#13'Wow!!!');
    end;
    end.
    <pre>(Bernhard Berger)

    Tschüss Ti

    Comment

    Working...
    X