Entwickler-Ecke

Windows API - SysTray-Icons kontrollieren


hitstec - Mi 10.07.02 13:08
Titel: SysTray-Icons kontrollieren
Hi,

ich suche eine Möglichkeit, wie ich auf alle Icons im Systray (neben der Uhr) beliebig zugreifen kann.
Ich weiß, dass man dazu nur das Handle des Fensters und die Uid des icons benötigt.

Also wenn man das Handle der fremden Anwendung und die Uid des Icons hat, dann kann man das Icon dieser fremden Anwendung beliebig verändern:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TaskBarRemoveIcon(hwHandle:Hwnd; iUid:Integer): Boolean;
var tnid : TNOTIFYICONDATA ;
begin
 tnid.cbSize := sizeof(TNOTIFYICONDATA);
 tnid.Wnd := hwHandle;
 tnid.uID := iUid;
 Result:=Shell_NotifyIcon(NIM_DELETE, @tnid);
end;

Das Handle eines Fensters zu finden ist einfach, wie bekommt man allerdings die Uid des Icons?
Die Shareware systrayx, http://www.systrayx.com/, ist im Stande diese Id herauszufinden.

Weiß jemand wie das geht?

---

Eine Möglichkeit wäre es, einfach durchzuprobieren, von 0 bis 255 nehme ich an. Ich vermute nämlich das eine Uid eines Icons in diesem Bereich liegen darf. Weiß jemand was konkretes?

---

Eine weitere Frage wäre: wie kann ich die Anzahl und die Rheinfolge der im SysTray befindenden Icons herausfinden?


Mit Dank.

Alex.


OregonGhost - Mi 10.07.02 13:29

Allein schon die Tatsache, das der Name der ID uID ist, bedeutet, dass es sich um einen ULONG, also um einen 32-bit breiten vorzeichenlosen Integer handelt, der folglich über 4 Mrd. Werte annehmen kann ;c)
Allerdings ist davon auszugehen, dass die meisten Anwendungen einen relativ niedrigen Wert nehmen, z.B. 0 oder 1000, und noch dazu immer denselben.

Du kannst übrigens auch mal TDUMP (im Delphi\BIN-Verzeichnis) mit der SysTrayX-Exe ausführen und so herausfinden, welche API-Funktionen das Programm verwendet.


hitstec - Mi 10.07.02 14:13

Hi,
OregonGhost hat folgendes geschrieben:
Allein schon die Tatsache, das der Name der ID uID ist, bedeutet, dass es sich um einen ULONG, also um einen 32-bit breiten vorzeichenlosen Integer handelt, der folglich über 4 Mrd. Werte annehmen kann ;c)
Allerdings ist davon auszugehen, dass die meisten Anwendungen einen relativ niedrigen Wert nehmen, z.B. 0 oder 1000, und noch dazu immer denselben.

Jau, da hastu wohl mehr als Recht. Nun, war auch eine dumme Frage von mir.

OregonGhost hat folgendes geschrieben:
Du kannst übrigens auch mal TDUMP (im Delphi\BIN-Verzeichnis) mit der SysTrayX-Exe ausführen und so herausfinden, welche API-Funktionen das Programm verwendet.

Folgendes hat TDUMP u. a. herausgebracht

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Imports from STXDLL.dll
    (hint = 000A) g_flag_win_xp
    (hint = 0003) UninstallHooks
    (hint = 0008) g_flag_reverse_tray
    (hint = 000C) g_hwnd_tray_toolbar
    (hint = 0002) SpecialCopyIcon
    (hint = 000E) g_shell_tray_hwnd
    (hint = 000F) g_special_tray_op
    (hint = 0009) g_flag_tray_aquired
                  FindSpecialWindows
    (hint = 0001) InstallHooks
    (hint = 0004) WM_USER_STX_HOOK_MSG
    (hint = 0005) WM_USER_TASKBAR_CREATED
    (hint = 000D) g_path_file_stx

Imports from SHELL32.dll
    (hint = 0079) Shell_NotifyIconA
    (hint = 0072) ShellExecuteA
    (hint = 0053) SHGetSpecialFolderLocation
    (hint = 003F) SHFileOperationA
    (hint = 0039) SHBrowseForFolderA
    (hint = 0050) SHGetPathFromIDListA

Ich kenne mich leider mit der Winapi nicht sehr gut aus. Kannst du mir da weiter helfen?


hitstec - Mi 10.07.02 14:16

PS: Stxdll.dll ist eine DLL von dem Herrsteller von SysTrayX.

Kann ich denn wenigstebs irgendwie die Funktionen daraus extrahieren oder die Funktionsweise nachvollziehen?


OregonGhost - Do 11.07.02 11:42

Das hat dir folgendes gebracht: Du weißt jetzt, welche Funktionen das Programm verwendet. Die Imports aus der Shell32.dll sind's wohl nicht. Ganz offensichtlich arbeitet das Programm aber mit Hooks, die in der STXDLL.dll installiert werden. Lass TDump einmal mit der DLL laufen, vielleicht bekommst du dort eine interessante Funktion.
Wahrscheinlich musst du mit SetWindowsHookEx() einen Hook installieren, z.B. einen WH_CALLWNDPROC oder WH_GETMESSAGE.
Da Shell_NotifyIcon() eine Nachricht an das TNA-Fenster sendet, musst du also wahrscheinlich diese Nachrichten abfangen, wenn eine Anwendung ein Icon erstellt oder verändert. Ich persönlich wüsste außer durch probieren allerdings nicht, wie man die IDs bekommen könnte.


hitstec - Do 11.07.02 16:17

Was sind Hooks? Und in wie fern stehen sie mit der TNA in Verbindung?


OregonGhost - Do 11.07.02 18:26

Eine Hookprozedur ist eine Funktion, die du mit SetWindowsHookEx() Windows bekannt machst, und die dann immer, wenn das entsprechende Ereignis eintritt (je nach Typ), aufgerufen wird und so u.a. Nachrichten abfangen kann. Wenn du also die Nachrichten NIM_ADD etc. abfängst, kriegst du die uID eines jeden neuen oder modifizierten Icons.
Schau mal in der Hilfe bzw. in den PSDK-Docs unter SetWindowsHookEx() nach (oder bei google (c; ), oder vielleicht steht hier in den FAQs auch schon was zu Hooks.