Announcement

Collapse
No announcement yet.

NOTIFYICONDATA -> zugehöriger Dateiname

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

  • NOTIFYICONDATA -> zugehöriger Dateiname

    Hallo!<p>
    Ich habe ein außergewöhnliches aber interessantes Problem.<br>
    Ich habe die komplette NOTIFYICONDATA-Struktur eines fremden Tray Icons.<br>
    Nun möchte ich den Prozess (eigentlich den EXE-Dateinamen) haben, der zu diesem Tray Icon gehört!<p>
    Das Problem bei der Sache ist, dass ich mit<br>
    - GetModuleFileName(GetWindowLong(NOTIFYICONDATA.Wnd , GWL_HWNDPARENT), ...);<br>
    - GetWindowThreadProcessId(); EnumWindows();<br>
    - und ähnlichem<br>
    nicht weiterkomme, da das Parentfenster des Tray Icon Wnd natürlich die TNA ist und ich somit immer als Dateiname "explorer.exe" zurückbekomme.<p>
    Wer weiß mit welchen Daten der NOTIFYICONDATA-Struktur und welchen API-Befehlen ich ans Ziel komme?<p>
    Viele Grüße,<br>
    Markus

  • #2
    Hallo,

    angenommen, eine Delphi-Anwendung legt ein Symbol in der TNA an:
    <pre>
    procedure TFormLogin.FormCreate(Sender: TObject);
    var
    aNID : TNotifyIconData;
    begin
    with aNID do begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Handle;
    uID := 99;
    uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
    uCallBackMessage := PM_TaskBar;
    hIcon := LoadImage(hInstance, PChar('TEST'), IMAGE_ICON, 16, 16, 0);
    szTip := 'Test';
    end;
    Shell_NotifyIcon(NIM_ADD, @aNID);
    end;
    </pre>
    In diesem Fall sorgt die Zuweisung von <b>Wnd := Handle;</b> dafür, dass Windows den Empfänger aller folgenden Botschaften kennt. Und über <b>uID := 99;</B> legt die Anwendung den "richtigen" Kanal fest, um verschiedene TNA-Symbole voneinander unterscheiden zu können (wenn mehrere genutzt werden). Somit führt das in <i>TNotifyIconData.Wnd</i> (alias <i>NOTIFYICONDATA.hWnd</i>) abgelegte Fensterhandle zur dazugehörenden Anwendung.

    Wenn beim GetModuleFileName-Aufruf auch GWL_HWNDPARENT angefordert wird, erhält man das Fenster der Shell (d.h. von wo aus die EXE der Anwendung gestartet wurde - also in diesem Fall explorer.exe)

    Comment


    • #3
      Hi Andreas.<p>
      Du hast natürlich vollkommen recht. Ich stand da etwas auf dem Schlauch und mit einem tieferen Blick in das PSDK hätte ich Dir/Euch wohl diese Frage ersparen können.<br>
      Allerdings scheint es so, als ob man in meinem Fall nur weiterkommt, wenn man alle Prozesse enumeriert (Win9x: <tt>CreateToolhelp32Snapshot()</tt>, <tt>Process32First()</tt>, <tt>Process32Next()</tt>; WinNT: <tt>EnumProcessModules()</tt>).<br>
      Und daran hatte ich anfangs garnicht gedacht, d.h. ich habe immer nur mit <tt>GetWindowLong()</tt> u.ä. experimentiert.<p>
      Vielen Dank nochmal, dass Du mich auf die richtige Fährte gebracht hast!<p>
      Gruß,<br>
      Marku

      Comment

      Working...
      X