Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - FreewareComp ähnlich wie WinTray
Richard.III - Do 25.09.03 12:29
Titel: FreewareComp ähnlich wie WinTray
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):
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.
http://www.kuliba.com/wintray.htm
Wer helfen kann oder ne Idee hat....
Danke
Ri3
UC-Chewie - 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 (
http://www.delphi-forum.de/viewtopic.php?t=13265&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.
Richard.III - Mo 29.09.03 20:03
Hier mal nen Screen mit WinTray (Demo.EXE ;) und EDA:
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 - 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...)
UC-Chewie - 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:
Motzi - 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.
digleu - 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:
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!