Autor Beitrag
hitstec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Mi 10.07.02 13:08 
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:
ausblenden 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, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: 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.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
hitstec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: 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.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
hitstec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Do 11.07.02 16:17 
Was sind Hooks? Und in wie fern stehen sie mit der TNA in Verbindung?


Zuletzt bearbeitet von hitstec am Di 16.07.02 20:45, insgesamt 1-mal bearbeitet
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: 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.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.