Ja, es gibt eine NotifyIcon-Klasse im .Net-Framework, aber ich konnte sie nicht richtig verwenden.
"Das allgemeine NotifyIcon ist nicht sichtbar, wenn Sie einen Standard-KDE-Desktop ausführen;
es erfordert ein Gnome Panel namens Notification Area Applet"
http://www.codeproject.com/Articles/466805/AmberIndicator-a-systray-app-under-Linux
"Unter openSUSE, Fedora und Ubuntu ist NotifyIcon nicht nutzbar"
https://bugzilla.novell.com/show_bug.cgi?id=590093
"NotifyIcon erscheint nicht im Systray (Getestet auf OS: Fedora, Arch. DE: MATE, Cinnamon)"
https://bugzilla.xamarin.com/show_bug.cgi?id=14976
Es sollte etwas mehr mit DBus integriert werden.
Die Grundidee besteht darin, ein Symbol im Infobereich zu erstellen
ist weniger lästig als das Öffnen eines Dialogs (der Dialog unterbricht die aktuelle Arbeit und das Symbol kann vom Benutzer für einige Zeit ignoriert werden). Das Symbol ist jedoch auch schwerer zu erkennen, daher gibt es eine Funktion, mit der Taskleistensymbole kleine Sprechblasen anzeigen können (kann die Sprechblase Bilder oder Videostreams von der Eingangstürkamera enthalten oder nur Zeichenfolgen anzeigen?). Dies bedeutet insbesondere, dass der Ballon nach einiger Zeit verschwinden sollte (aber der Rigo-Manager macht einen Fehler - er erfordert, dass der Benutzer den Ballon manuell schließt).
Es gibt auch _Workspace Switcher Applet_, das sich gut über DBus integrieren lässt. Anwendungsszenario - MDI-Programme, die unterschiedliche Dokumentensätze auf unterschiedlichen Arbeitsbereichen anzeigen sollen. Ich habe eine weitere Funktionsanfrage für Arbeitsbereiche erstellt – https://github.com/picoe/Eto/issues/409
„Die GNOME-Taskleiste kann horizontal oder vertikal sein“
"Die Taskleiste koordiniert Sprechblasenmeldungen, um sicherzustellen, dass sie ein einheitliches Erscheinungsbild haben, und um zu vermeiden, dass mehrere Sprechblasenmeldungen gleichzeitig angezeigt werden. ... Systemablagen können Teile von Nachrichten von mehreren Taskleistensymbolen gleichzeitig empfangen, dies ist erforderlich um die Nachrichten basierend auf der Fenster-ID des Taskleistensymbols neu zusammenzusetzen.... Eine Sprechblasennachricht ist eine kurze Textnachricht.... Die Nachricht kann eine Zeitüberschreitung haben; wenn dies der Fall ist, wird die Nachricht nach Ablauf der Zeitdauer entfernt. ...Das Taskleistensymbol möchte möglicherweise eine zuvor gesendete Sprechblasennachricht abbrechen."
einige URLs:
Laut GNOME HIG gibt es zwei Möglichkeiten, ein Symbol zum Bedienfeld hinzuzufügen:
A. Das Panel-Applet (diese sind links von "Wanda-the-fish")
B. Benachrichtigungsbereichssymbol (Das Benachrichtigungsfeld selbst wird dem Bedienfeld als Bedienfeldappet hinzugefügt)
Mono implementiert das "Notification area icon" über der X11-Spezifikation (direkt, ohne Gtk#).
mono verwendet die XplatUI-Schnittstelle mit Methoden
SystrayAdd, SystrayRemove, SystrayChange, SystrayBalloon, SendMessage, SetForegroundWindow
https://github.com/mono/mono/blob/ef380e3712af86ef7f8064fab19400523c7510c0/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L1106-L1128
Die Anrufe werden an das Mitglied weitergeleitet
static XplatUIDriver driver;
was ist vom typ ??? für MATE-Umgebung.
Ich weiß nicht, was den zu verwendenden Treiber auswählt. Wahrscheinlich ist es XplatUIX11, das in dieser Zeile ausgewählt wird:
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUI.cs#L112
Das Taskleistensymbol ist ein Fenster, das in die Taskleiste eingebettet wird.
interne Klasse NotifyIconWindow : Form { ... // line 57
privates NotifyIconWindow-Fenster; // Zeile 45
window = new NotifyIconWindow(this); // Zeile 389
XplatUI.SystrayAdd(window.Handle, text, icon, out tooltip); // Zeile 524
Problem beim Zeichnen:
https://bugzilla.novell.com/show_bug.cgi?id=324237#c13
"Auf 64-Bit-Rechnern wird das Symbol überhaupt NICHT in der Taskleiste angezeigt."
Transparenzproblem:
http://lists.ximian.com/pipermail/mono-winforms-list/2007-December/003173.html
Der Grund des Problems ist die Zeile 189
(Dies ist ein nicht behobener Fehler mit 8 Jahren Geschichte)
Der Anhang in der Mailinglistennachricht enthält jedoch einen Beispielcode für die Anwendung.
siehe auch
http://standards.freedesktop.org/systemtray-spec/latest/ar01s06.html
Problem beim Neuzeichnen:
http://mono.1490590.n4.nabble.com/NotifyIcon-and-ContextMenu-redrawing-issues-in-gnome-td1541474.html
https://bugzilla.novell.com/show_bug.cgi?id=324237
https://bugzilla.novell.com/show_bug.cgi?id=MONO81668
Die Konventionen für die Auswahl von Managern sind im ICCCM definiert ( http://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#manager_selections ).
Die Taskleiste ist ein X-Client, der eine spezielle Managerauswahl auf einem bestimmten Bildschirm besitzt.
Eine Anwendung, die ein Symbol für die Taskleiste bereitstellen möchte, sollte zuerst die Taskleiste lokalisieren
durch Aufrufen des Besitzerfensters der Managerauswahl.
Wenn die Managerauswahl keinen Besitzer hat, können Clients die in ICCCM beschriebene Methode (Überwachen auf eine MANAGER-Client-Nachricht) verwenden, um benachrichtigt zu werden, wenn ein Systemtray erscheint.
Das Auswahlbesitzerfenster ist nicht dasselbe wie eines der vom Benutzer sichtbaren Fenster, die von der Taskleiste bereitgestellt werden (mit anderen Worten - die Managerauswahl ist wahrscheinlich nicht dasselbe Fenster, das die Taskleistensymbole enthält), da das Auswahlbesitzerfenster sollten vernichtet werden, wenn die Managerauswahl verloren geht.
die Taskleiste muss eine Manager-Auswahl namens _NET_SYSTEM_TRAY_Sn erhalten, wobei n durch die Bildschirmnummer ersetzt wird, die die Taskleiste verwenden möchte:
XGrabServer(DisplayHandle);
SystrayMgrWindow = XGetSelectionOwner(DisplayHandle, _NET_SYSTEM_TRAY_S);
XUngrabServer(DisplayHandle);
XFlush(DisplayHandle);
Xlib.XGrabServer (display);
IntPtr SystrayMgrWindow = Xlib.XGetSelectionOwner (display, Atoms._NET_SYSTEM_TRAY_S);
Xlib.XUngrabServer (display);
das Nachrichtenformat ist hier beschrieben:
http://standards.freedesktop.org/systemtray-spec/latest/ar01s04.html
Ist es möglich, X-Nachrichten zu senden, ohne Xlib und die zugrunde liegende XCB-Bibliothek zu verwenden?
dh direkt von C#-Code zu "wire"?
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms/XplatUIX11.cs#L6259
SendNetClientMessage(SystrayMgrWindow, _NET_SYSTEM_TRAY_OPCODE, IntPtr.Zero, (IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK, hwnd.whole_window);
https://github.com/mono/mono/blob/b7a308f660de8174b64697a422abfc7315d07b8c/mcs/class/System.Windows.Forms/System.Windows.Forms.X11Internal/X11Display.cs#L413-L417
SendNetClientMessage (SystrayMgrWindow,
Atoms._NET_SYSTEM_TRAY_OPCODE,
IntPtr.Zero,
(IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK,
hwnd.WholeWindow);
https://en.wikipedia.org/wiki/D-Bus
D-BUS ist ein Interprozess-Kommunikationssystem (IPC), das einen einfachen, aber leistungsstarken Mechanismus bereitstellt, mit dem Anwendungen miteinander kommunizieren, Informationen austauschen und Dienste anfordern können.
"D-BUS kann zu einem einheitlichen und agnostischen IPC-Mechanismus werden, der von beiden Desktops (GNOME und KDE) verwendet wird"
_aber, aber, aber - ICCCM ist auch prozessübergreifend, einheitlich und agnostisch..._
siehe The Kernel Event Layer - DBus Ein einzelner Bus, der vom gesamten System gemeinsam genutzt wird, ermöglicht die Weitergabe von Ereignissen vom Kernel bis zu den obersten Anwendungen im System.
Ereignisse wie eine volle Festplatte und eine leere Druckerwarteschlange oder sogar ein niedriger Batteriestand können den Systemstapel aufblähen, der für jede Anwendung verfügbar ist, sodass das System reagieren und reagieren kann.
Die D-Bus-Spezifikation
http://dbus.freedesktop.org/doc/dbus-specification.html
DBus-Bibliothek für C# (kein Wrapper, reines C#)
https://github.com/mono/dbus-sharp
Panel Applet Library Referenzhandbuch
https://developer.gnome.org/panel-applet/stable/
GnomeGoal soll alle Gnome-Applets auf die neue DBUS-API (von Bonobo) portieren.
https://wiki.gnome.org/Initiatives/GnomeGoals/AppletsDbusMigration
Gibt es so etwas wie Ubuntu-Panel-Applets?
Kompatibilität zwischen Gnome und Unity-Panel (Applet).
http://ubuntu.itsprite.com/ubuntugnome-vs-unity-panel-applet-compatibility/
Status-Notifier-Spezifikation (SNI, org.freedesktop.StatusNotifierItem)
http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/
"Es soll ein Ersatz für die Freedesktop System Tray-Spezifikation sein ...
es wird in der Produktion mindestens von KDE Plasma und Unity verwendet"
libappindicator-Referenzhandbuch
http://developer.ubuntu.com/api/devel/ubuntu-12.04/c/appindicator/
Ayatana-Indikatoren im Gnome-Panel:
https://launchpad.net/indicator-applet
Es gibt ein Panel-Applet für MATE:
https://github.com/mate-desktop/mate-indicator-applet
Informationen aus verschiedenen Anwendungen konsistent im Panel anzuzeigen.
Benachrichtigungssymbol in Ubuntu mit Unity und Mono C#-Beispiel:
http://www.arvydas.co.uk/2012/08/notification-icon-in-ubuntu-with-unity-and-mono-c-sharp-example/
Jeder Indikator installiert eine kleine Datei in /usr/share/unity/indicators, die definiert, wo er auf DBus zu finden ist und wie er im Panel angezeigt werden soll. Der Indikatorprozess wird vom Session-Init-Daemon verwaltet.
Spezifikation für Desktop-Benachrichtigungen
http://www.galago-project.org/specs/notification/0.9/index.html
" Bilder können in die Benachrichtigung eingefügt werden, aber dies sollte mit Vorsicht erfolgen. Das Bild sollte nie größer als 200 x 100 sein, aber dies sollte als maximale Größe betrachtet werden."
https://wiki.ubuntu.com/MessagingMenu/
So machen Sie das Menüfenster transparent:
http://www.linuxandlife.com/2012/05/ubuntu-panel-transparent.html
"Indikatoren können im Panel nur eine Beschriftung oder ein Symbol enthalten
kein benutzerdefiniertes Rendering oder andere Widgets"
Anwendungsindikatoren verwenden eine feste Symbolgröße von 22 Pixel.
https://bugs.launchpad.net/ubuntu/+source/indicator-application/+bug/533439
"Die Libindicator-API erlaubt nicht die Angabe der Symbolgröße und
Daher ist die Konvention, dass alle Symbolgrößen 22 Pixel betragen."
Ändern und aktualisieren Sie das Statussymbol eines laufenden Anzeige-Applets
http://www.helptouser.com/ubuntu/11162-is-it-possible-to-änder-and-update-the-status-icon-of-a-running-indicator-applet.html
xeingebettete Elemente sind fest auf 22×22 Pixel codiert
Status-Notifier-Spezifikation, KStatusNotifierItem-Klasse
https://github.com/lxde/lxqt/issues/359
März 2014-03-04, Taskleiste in Plasma Next
http://blog.martin-graesslin.com/blog/2014/03/system-tray-in-plasma-next/
"Wir wollen keine Zeit in die Implementierung des Legacy-Systems (xembed) für Plasma Next investieren"
„Die meisten GTK+-Anwendungen verwenden auch die Appindicator-Bibliothek für die Unity-Integration, sodass sie einfach so funktionieren, wie wir es wollen.“
"Obwohl es bis Qt 5.4 dauern wird, bis das Feature richtig funktioniert."
"Es ist möglich, dass es Anwendungen gibt, die noch das Legacy-Protokoll verwenden und das kaputt geht."
https://wiki.gnome.org/Design/OS/MessageTray
"Die Designseiten des Message Tray sind veraltet und werden nur zu Referenzzwecken aufbewahrt. Aktuelle Designs finden Sie auf der Benachrichtigungsseite."
https://wiki.gnome.org/Design/OS/Notifications
Es gibt auch "Indicator Applet" von Drittanbietern für Gnome 3 in den Repositories von Ubuntu:
https://code.launchpad.net/~jconti/indicator-applet/gnome3
http://live.gnome.org/GnomeShell/Extensions
Die GNOME-Shell ermöglicht eine sehr begrenzte Anpassung (by design) und die Taskleiste ist keiner dieser Bereiche. Tatsächlich dient die Tatsache, dass es existiert, nur dazu, bestimmte Legacy-Anwendungen zu unterstützen.
"Systray-Icons werden als häufige Ablenkungsquelle angesehen, die die Entwickler loswerden wollen."
„Wenn wir das Problem richtig angehen wollen, müssen wir eine neue API einrichten und den Anwendungen Zeit geben, darauf zu portieren. Wir arbeiten derzeit an einem Plan dafür.“
http://worldofgnome.org/shell-new-notifications-goodbye-message-tray/
2014-01-05, "GNOME-Entwickler planen einige bedeutende Änderungen hin zu einem komplett neuen Benachrichtigungssystem."
https://blogs.gnome.org/aday/2014/06/18/a-notifications-update/
Fedora 22 (GNOME 3.16) hat diese erweiterbare Legacy-Symbolleiste in der unteren linken Ecke des Bildschirms eingeführt:
Veraltete "Tray"-Symbole werden in einer "Schublade" angezeigt, die Autohide in der unteren linken Ecke des Bildschirms verwendet.
Versionshinweise zu Gnome 3.16
https://github.com/gnome-design-team/gnome-mockups/tree/master/notifications
Stilvolles oberes Bedienfeld, das Anzeigen enthält und einen Anwendungsstarter erzeugt
elementares Betriebssystem, das Ayatana-Indikatoren ablehnt:
https://github.com/dyson/indicator-workspaces/issues/3
Diese neuen Indikatoren haben ein bisschen mehr Freiheit (Sie sind nicht auf ein Menüdesign beschränkt, können jetzt jedes Widget darin haben), also sollten Sie darauf achten. ;) Ayatana-Indikatoren werden weiterhin technisch unterstützt
Ein Beispiel für die Arbeit mit Panels ist die Workrave-Anwendung.
es hat eine Klasse für jeden Panel-Typ.
dort sind https://github.com/rcaelers/workrave/tree/7cb9aef971f21c9a473146f9b72693b86a4a76f6/frontend/applets
"zimt", "common", "gnome-shell", "gnome2", "gnome3", "indicator", "mate", "win32", "xfce"
Kann jemand meine einfachen Fragen beantworten?
1) Können wir jetzt Tray-Icons mit Eto erstellen?
2) Welche Betriebssysteme werden unterstützt?
3) Wo kann ich das nachlesen? Vielleicht Klassenname?
Schlechte Nachrichten, immer noch kein Support, gute Nachrichten, ich wollte das über dieses Wochenende für Linux und Windows implementieren :)
Wirklich cool! :) Ist jetzt nur Merge erforderlich?
Und MAC-OS?
Ich glaube nicht, dass wir Tray-Emulation in Android brauchen :)
Wirklich cool! :) Ist jetzt nur Merge erforderlich?
Ich habe immer noch nicht angefangen, daran zu arbeiten ... aber ich weiß, was getan werden muss, und ich musste vorher # 714 erledigen.
Und MAC-OS?
Jemand anderes muss es für MacOS implementieren, das einzige MacOS, das ich habe, ist auf einer VirtualBox, die verdammt langsam ist.
Linux Gtk-Version fast fertig :D
Gute Arbeit! :)
Ist es ein normales Fenster oder ein Popup mit begrenztem Inhalt erlaubt?
Gute Arbeit! :)
Ist es ein normales Fenster oder ein Popup mit begrenztem Inhalt erlaubt?
So sieht das Kontextmenü auf GNOME mit der Erweiterung libappindicator auf :P aus
Ohne die seltsamen Erweiterungen, die ich auf meinem System habe, sieht es so aus:
So sieht das Kontextmenü auf GNOME mit der Erweiterung libappindicator auf :P aus
Ich bin mir nicht sicher, ob ich das verstehe ... Ich habe erwähnt, ob es möglich ist, dort Inhalte anzuzeigen, z. B. Bilder anstelle von Hello World? Zum Beispiel können wir das in Windows nicht machen (nur Menüpunkte mit Symbolen). Um das zu bekommen, müssen wir ein eigenes Fenster implementieren und es in der Nähe des Taskleistensymbols oder Mausklicks anzeigen. Außerdem müssen wir Koordinaten übersetzen, da das Taskleistensymbol (das höchstwahrscheinlich verwendet wird) Teil von Windows.Forms und nicht von WPF ist.
Nochmals ... so sieht ein Kontextmenü auf meinem System aus ... sehen Sie sich den zweiten Screenshot an, er zeigt genau das Gleiche, außer dass ein Teil meines Themas deaktiviert ist.
@hardhub afaik, Sie können benutzerdefinierte Steuerelemente mit Winforms (und MacOS) in einen Menüpunkt einfügen. Ich weiß aber nicht, ob das auf GTK# funktionieren würde.
@cwensley Ich muss dazu nur eine negative Sache melden, Appindicator erlaubt das Laden von Symbolen aus dem Speicher nicht ... also musste ich Etos API für TrayIcon dazu bringen, es von einem tatsächlichen Dateipfad zu laden ...
@cra0zy Nun , das ist ziemlich scheiße. Vielleicht können wir in eine temporäre Datei oder so etwas schreiben.
@cwensley ,
Ich meine das:
https://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon (v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.menuitem (v=vs.110).aspx
Sie können dort nur Text und Symbol einfügen ...
@cra0zy Nun , das ist ziemlich scheiße. Vielleicht können wir in eine temporäre Datei oder so etwas schreiben.
Das habe ich bereits getan.
@hardhub ah richtig, es verwendet MenuItem
, nicht ToolStripMenuItem
.. ugh. In jedem Fall können wir die benutzerdefinierte Fensterfunktion einfach in die Windows-Plattform einbauen, sodass sie nicht manuell implementiert werden muss, wenn Sie sie verwenden möchten.
Reden Sie von einem Linksklick-Fenster, wie es der Lautstärkemixer in Windows 7 war? Ich bin etwas verwirrt...
Wie auch immer, das Folgende ist die Struktur der API:
```c#
public bool Sichtbar { erhalten; einstellen; }
öffentlicher String Titel { erhalten; einstellen; }
öffentliches Ereignis aktiviert { get; einstellen; }
public void SetMenu (Kontextmenü-Menü);
public void SetIcon(Icon-Icon);
öffentlich void Show();
öffentlich void Hide();
```
@cra0zy , ich denke, ein Linksklick öffnet ein benutzerdefiniertes Fenster. Ich schrieb über Rechtsklick. Zumindest sieht Ihr Beispiel mit dem Element "Beenden" wie ein Rechtsklickmenü aus.
@cwensley
Wir können versuchen, die ContextMenuStrip-Eigenschaft zu verwenden ... aber ich denke, es wird nichts Benutzerdefiniertes hinzufügen können ...
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip (v=vs.110).aspx
Ich denke, Sie haben erwähnt, dass wir Bilder links vom Menüelement hinzufügen können ... ja, das können wir ... aber ich sagte über das benutzerdefinierte Layout des Popups, das in der Taskleiste verfügbar ist. Ich habe das Bild als benutzerdefinierten Inhalt erwähnt, nicht als ein kleines Symbol links vom Element.
WinForms-Implementierung abgeschlossen:
Gtk Mac/Windows-Implementierung abgeschlossen:
Wpf-Implementierung abgeschlossen:
PR aufwärts: #731
@cwensley Dies kann geschlossen werden.
@cra0zy muss noch einen Mac-Port machen, aber das ist mit #750 abgedeckt
Hilfreichster Kommentar
Wpf-Implementierung abgeschlossen: