Autor Beitrag
Richard.III
Hält's aus hier
Beiträge: 2

Win2000Prof
D5 E, D6 E
BeitragVerfasst: Do 25.09.03 12:29 
Hi Leute,

hab da ein etwas größeres Problem. Ich suche eine FreewareComp für Delphi die Folgendes erledigt: Sie soll ganz einfach kein Icon (16x16), sondern Text (beliebige Weite) in den SystemTray reinbringen. Und ich hab jetzt etwa zwei Tage gegooglet und nix gefunden. Natürlich hab ich auch selbst versucht was hinzubekommen - gibt ja genug Sources für Icons im SysTray, aber leider nicht für Text.

So sollte es simple aussehen (Label1): user defined image

Folgende Comps hab ich getestet, welche aber leider aus unterschiedlichen Gründen nicht meine Erfüllung verheißen:

1) TextTrayIcon (der Bruder von CoolTrayIcon). Bringt zwar Text ins Spiel, aber leider nur auf einer Fläche von 16x16 (Icongröße). Die Icon.Width ist nicht editierbar. Wenn man das abändernkönnte wäre es schon sehr nah dran.

2) WinTray. Volltreffer. Jedoch Shareware und 799$ finde ich persönlich etwas übertrieben. www.kuliba.com/wintray.htm

Wer helfen kann oder ne Idee hat....

Danke

Ri3
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Mo 29.09.03 01:36 
Hm, Trayicons dürfen AFAIK nur 16x16 Pixel groß sein. Bei TextTrayIcon wird das wohl so ablaufen, dass ein Icon anhand des Textes erzeugt wird, deshalb nur 16x16.

Hast du den Screenshot selber gemacht oder hast du ein Programm, mit dem das geht? Wenn diese Konstellation wirklich geht, dann mach folgendes: Lad dir Assarbads EDA (www.delphi-forum.de/...65&highlight=eda) runter und sag mir mal, ob dieser Text zur Toolbar dazugehört oder ein eigenes Fenster ist.

Die Tray beinhaltet eine Toolbar und dieUhr; vielleicht kannst du irgendwie dein Text selbst in die Tray (Klasse TrayNotifyWnd) zeichnen.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Richard.III Threadstarter
Hält's aus hier
Beiträge: 2

Win2000Prof
D5 E, D6 E
BeitragVerfasst: Mo 29.09.03 20:03 
Hier mal nen Screen mit WinTray (Demo.EXE ;) und EDA:

user defined image

Folgendes hab ich damit rausgefunden:

TrayNotifyWnd ist normalerweise mit zwei Objekten belegt:
1) ToolbarWandow32 (hier sind alle Icons drin enthalten)
2) TrayClockWClass

Der von WinTray erzeugte Panel ist also direkt in die TrayNotifyWnd gezeichnet und rechtsbündig angeordnet.

Werd mal nen bischen rumtesten. Wer nen Source hinkriegt, bitte sofort posten ;)

Ri3
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 29.09.03 20:13 
Wenn du mir sagst wo man das Demo kriegt kann ich auch ein bisschen rumtesten (hab schon eine Idee wie das funktionieren könnte...)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Mo 29.09.03 20:17 
Motzi hat folgendes geschrieben:
Wenn du mir sagst wo man das Demo kriegt kann ich auch ein bisschen rumtesten (hab schon eine Idee wie das funktionieren könnte...)


Hat er doch oben geschrieben...
Dort gibts eine Demo-Version zum Download.
Siehst du schon VirtualAllocateEx vor deinen Augen :mrgreen:

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 30.09.03 10:05 
Also Kuliba arbeitet wie erwartet mit einer Inject-Dll (was die Sache ziemlich kompliziert macht!).
Diese Inject-Dll "ITRLib.dll" exportiert folgende Funktionen
  • SetITRHook
  • GetHandleTray
  • GetTrayRect
  • SetTrayRect
  • IsHookSet
  • GetWndDlg

Außerdem lassen die importierten Funktionen der Dll vermuten, dass ein Hook gesetzt wird... nähere Infos kann ich erst liefern wenn ich zu Hause bin (wo ich die nötigen Werkzeuge habe ;))

Edit: der Hook wird wahrscheinlich verwendet um die Dll in den Parent-Prozess des Tray (explorer.exe) zu injezieren. Dafür wird dann wahrscheinlich die WndProc des TrayNotifyWnd-Fensters gesubclasst.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
digleu
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 12.02.06 15:34 
darf man denn mal bei diesem wohl schon etwas veralteten Thema Frage ob noch Erfolge zu verzeichnen sind?

Beschäftige mich nun selbst seit 2 Tagen mit dem Thema und komme auf keinen grünen Zweig. Ich würde halt gerne neben der Uhr platz für einen Panel oder Label oder soetwas machen. Vielmehr als an die Stelle der Uhr selbst einen Panel zu setzen (dessen Größe ich aber nichtmal ändern kann) habe ich nicht geschaft, dazu habe ich folgenden Code verwendet:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.ReplaceSystemClock;
var Rect, ClockRect: TRect;
    TaskbarHwnd, TrayHwnd, ClockHwnd: HWND;
begin
  TaskbarHwnd := FindWindow('Shell_TrayWnd'nil);
  TrayHwnd := FindWindowEx(TaskbarHwnd, 0'TrayNotifyWnd'nil);
  ClockHwnd := FindWindowEx(TrayHwnd, 0'TrayClockWClass'nil);

  GetWindowRect(TrayHwnd, Rect);
  GetWindowRect(ClockHwnd, ClockRect);

  ClockReplacer.Width := (ClockRect.Right - ClockRect.Left);
  ClockReplacer.Height := (ClockRect.Bottom - ClockRect.Top);
  ClockReplacer.Left := (Rect.Right - Rect.Left) - ClockReplacer.Width - 3;
  ClockReplacer.AutoSize := false;
  ClockReplacer.Top := 0;
  ClockReplacer.Show;
  Windows.SetParent(ClockReplacer.Handle, TrayHwnd);
  ClockReplacer.Repaint;
end;


Liebe Grüße und vielen Dank schonmal für alle Anregungen

Lars