[c#] Wie kann ich einen Systray-Tooltip länger als 63 Zeichen anzeigen?



Answers

Aus der MSDN-Dokumentation zur Struktur Win32 NOTIFYICONDATA :

szTip

Eine mit Null beendete Zeichenfolge, die den Text für eine Standard-QuickInfo angibt. Es kann maximal 64 Zeichen enthalten, einschließlich des abschließenden Nullzeichens.

Für Windows 2000 (Shell32.dll Version 5.0) und höher kann szTip maximal 128 Zeichen enthalten, einschließlich des abschließenden Nullzeichens.

Es sieht so aus, als ob die Windows Forms-Bibliothek hier den kleinsten gemeinsamen Nenner unterstützt.

Question

Wie kann ich einen Systray-Tooltip länger als 63 Zeichen anzeigen? NotifyIcon.Text hat ein 63-Zeichen-Limit, aber ich habe gesehen, dass VNC Server einen längeren Tooltip hat.

Wie kann ich tun, was VNC Server tut?




Ich bin kürzlich auf ein ähnliches Problem gestoßen. Anstatt das Back-End zu hacken, implementierte ich einen Work-Around, der den BalloonTipText nutzt, der eine ganze Reihe von Zeichen aufnehmen kann.

Der Tooltip wird beim ersten MouseMove-Ereignis über dem Taskleistensymbol angezeigt und der Tooltip wird für 2 Sekunden angezeigt. Wenn der Tooltip geschlossen ist, kann er durch ein neues MouseMove-Ereignis erneut geöffnet werden.

Der einzige Nachteil bei dieser Lösung ist, dass es nicht möglich ist, den Ballon programmatisch zu schließen, wenn ein Benutzer beispielsweise den Icon-Bereich verlässt, so dass er nur nach einem Timeout verschwindet oder wenn der Benutzer auf den kleinen X-Button klickt.

Beachten Sie, dass der Titel und der Text jederzeit an anderer Stelle im Programm eingestellt werden können. Sie werden hier nur zu Demonstrationszwecken in der Veranstaltung festgelegt.

ShowBalloonTip() : ShowBalloonTip() zusätzliche kaskadierende MouseMove Ereignisse aus. MouseMove muss dieses Ereignis deaktiviert werden, bis die MouseMove ausgeblendet wird. Darüber hinaus wird BalloonTipClosed (gemäß der Dokumentation ) nur ausgelöst, wenn der Benutzer aktiv auf "X" klickt, obwohl ich beobachtet habe, dass es ausgelöst wird, wenn der Tooltip nach einer Zeitüberschreitung geschlossen wurde. Ich habe daher einen Helfer-Timer hinzugefügt, um den Zustand zurückzusetzen, anstatt sich auf das BalloonTipClosed Ereignis zu verlassen. Der überarbeitete und getestete Code ist unten:

    private bool balloonTipShown;
    private Timer balloonTimer;
    private void trayIcon_MouseMove(object sender, MouseEventArgs e)
    {
        if (balloonTipShown)
        {
            return;
        }
        balloonTipShown = true;
        trayIcon.MouseMove -= trayIcon_MouseMove;
        balloonTimer = new Timer();
        balloonTimer.Tick += balloonTimer_Tick;
        balloonTimer.Interval = 2005;
        balloonTimer.Start();
        trayIcon.ShowBalloonTip(2000);
    }

    void balloonTimer_Tick(object sender, EventArgs e)
    {
        balloonTipShown = false;
        balloonTimer.Stop();
        balloonTimer.Dispose();
        trayIcon.MouseMove += trayIcon_MouseMove;
    }

EDIT 2: Ein Screenshot eines Balloon Tooltips mit ziemlich viel Text, der diese Lösung nutzt, kann in einem Blog gesehen werden .




Links