如何显示超过63个字符的系统托盘工具提示? NotifyIcon.Text有63个字符限制,但我已经看到VNC服务器有更长的工具提示。
我该怎么做VNC服务器呢?
答案 0 :(得分:28)
实际上,它是Text属性的属性设置器中的错误。 Windows窗体中的NOTIFYICONDATA的P / Invoke声明使用128个字符限制。你可以用反射来解决它:
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 });
}
}
答案 1 :(得分:8)
来自Win32上的MSDN文档NOTIFYICONDATA structure:
<强> szTip 强>
以空值终止的字符串,用于指定标准的文本 工具提示。它最多可以有64个 字符,包括终止 空字符。
对于Windows 2000(Shell32.dll版本5.0)及更高版本,szTip可以拥有 最多128个字符,包括 终止空字符。
看起来Windows窗体库支持这里最低的公分母。
答案 2 :(得分:1)
扩展bk1e的正确答案。
引擎盖下,WinForms中的系统托盘图标实现为Win32通知图标。因此,winforms版本具有作为本机版本的所有限制。工具提示大小限制只是一个例子。
答案 3 :(得分:1)
我最近遇到了类似的问题。我没有黑客攻击后端,而是使用了BalloonTipText,它可以容纳很多角色。
工具提示显示在托盘图标上的第一个MouseMove事件上,工具提示显示2秒钟。关闭工具提示后,可以通过新的MouseMove事件再次重新打开它。
这个解决方案的唯一不足之处在于,当用户离开图标区域时,无法以编程方式关闭气球,因此只有在超时或用户点击小X按钮后它才会消失
请注意,标题和文本可以随时在程序的其他位置设置。它们仅在演示时用于演示目的。
编辑: ShowBalloonTip()
会触发添加级联MouseMove
事件,因此必须先禁用此事件,直到隐藏气球工具提示为止。此外,BalloonTipClosed
(根据the documentation)仅在用户主动点击“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:使用此解决方案的大量文本的气球工具提示的屏幕截图可以是seen in by blog。
答案 4 :(得分:-4)
bk1e这里说限制是128个字符,现在,如果你使用UTF-16,这是Windows中的本机unicode格式,特别是.NET,这意味着你只能使用64个字符 ,包括NUL。
我相信您正在使用unicode API将工具提示限制为64个16位字符(包括null),而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“