如何显示超过63个字符的系统托盘工具提示?

如何显示超过63个字符的系统托盘工具提示? NotifyIcon.Text有63个字符限制,但我看到VNC服务器有更长的工具提示。

我该怎么做VNC服务器呢?

实际上,它是Text属性的属性设置器中的一个错误。 Windows窗体内的NOTIFYICONDATA的P / Invoke声明使用128个字符限制。 你可以用reflection破解它:

using System; using System.Windows.Forms; using System.Reflection; public class Fixes { public static void SetNotifyIconText(NotifyIcon ni, string text) { if (text.Length >= 128) throw new ArgumentOutOfRangeException("Text limited to 127 characters"); Type t = typeof(NotifyIcon); BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance; t.GetField("text", hidden).SetValue(ni, text); if ((bool)t.GetField("added", hidden).GetValue(ni)) t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true }); } } 

从Win32 NOTIFYICONDATA结构上的MSDN文档:

szTip

以null结尾的字符串,用于指定标准ToolTip的文本。 它最多可包含64个字符,包括终止空字符。

对于Windows 2000(Shell32.dll版本5.0)及更高版本,szTip最多可包含128个字符,包括终止空字符。

看起来Windows窗体库支持这里最小的公分母。

扩展bk1e的正确答案。

在引擎盖下,WinForms中的系统托盘图标实现为Win32通知图标。 因此,winforms版本具有作为本机版本的所有限制。 工具提示大小限制只是一个例子。

我最近遇到了类似的问题。 我没有黑客攻击后端,而是使用了BalloonTipText,它可以容纳很多角色。

工具提示显示在托盘图标上的第一个MouseMove事件上,工具提示显示2秒钟。 工具提示关闭后,可以通过新的MouseMove事件再次重新打开。

该解决方案的唯一缺点是,当用户离开图标区域时,无法以编程方式关闭气球,因此只有在超时或用户点击小X按钮后才会消失。

请注意,标题和文本可以在程序的其他位置随时设置。 它们仅在演示时用于演示。

编辑: ShowBalloonTip()触发添加级联MouseMove事件,因此必须禁用此事件,直到隐藏气球工具提示为止。 此外, BalloonTipClosed (根据文档 )仅在用户主动点击“X”时触发,但我发现在超时后工具提示关闭时会被触发。 因此,我添加了一个辅助计时器来重置状态,而不是依赖于BalloonTipClosed事件。 修订和测试的代码如下:

  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; } 

编辑2:一个带有大量文本的气球工具提示的截图,利用这个解决方案可以在博客中看到 。

bk1e这里说限制是128个字符,现在,如果你使用UTF-16,这是Windows中的本机u​​nicode格式,特别是.NET,这意味着你限制为64个字符 ,包括NUL。

我相信您正在使用unicode API将工具提示限制为64个16位字符(包括空值),而VNC服务器使用ascii(或ANSI)api代替,允许使用128个8位字符(包括null)。

编辑:这个答案是错误的,这是Cody Gray的一个有用的评论解释原因:

这种推理很有说服力,但实际上并不正确。 当MSDN文档谈到“字符”时,它实际上意味着数组中char或wchar_t项的数量(取决于您是否以Unicode为目标)。 因此,在Windows 2000+上运行时,您将获得承诺的全部128个字符。 Windows 9x限制为64个字符。 – Cody Gray Jun 19日4:11“