如何显示超过63个字符的系统托盘工具提示? NotifyIcon.Text有63个字符的限制,但我看到VNC服务器有更长的工具提示。如何显示超过63个字符的系统托盘工具提示?
我该怎么做VNC服务器呢?这里
如何显示超过63个字符的系统托盘工具提示? NotifyIcon.Text有63个字符的限制,但我看到VNC服务器有更长的工具提示。如何显示超过63个字符的系统托盘工具提示?
我该怎么做VNC服务器呢?这里
实际上,它是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 });
}
}
bk1e说,限制是128个字符,现在,如果你使用UTF-16,这是在Windows和.NET尤其是原生Unicode格式,这意味着你被限制为64个字符,包括NUL 。我认为你使用的unicode API将工具提示限制为64位16位字符(包括null),并且VNC服务器使用ascii(或ANSI)api代替,允许使用128位8位字符位字符(包括null)。
编辑:这个答案是错的,这里是由科迪灰色解释为什么一个有帮助的注释:
这种推理是令人信服的,但实际上并不正确。当MSDN文档谈到“字符”时,它实际上意味着数组中char或wchar_t项的数量(取决于您是否定位到Unicode)。因此,您在Windows 2000+上运行时会得到满足的128个字符。 Windows 9x被限制为64个字符。 - 科迪灰色6月19日在4:11"
从对Win32的NOTIFYICONDATA structure MSDN文档:
szTip
一个空值终止字符串,用于指定标准文本 工具提示最多可以有64个 字符,包括终止 空字符
对于Windows 2000(Shell32.dll版本5.0)及更高版本,szTip最多可以有 128个字符,其中包括 终止空字符。
看起来Windows窗体库在这里支持最低公分母。
展开bk1e的正确答案。
在引擎盖下,WinForms中的系统托盘图标实现为Win32通知图标。因此,Winforms版本与原生版本一样具有所有限制。工具提示大小限制仅仅是一个例子。
我最近遇到了类似的问题。我没有攻击后端,而是实现了一个解决方案,它使用了BalloonTipText,它可以容纳很多字符。
工具提示显示在托盘图标上的第一个MouseMove事件上,工具提示显示2秒钟。 Atter工具提示已关闭,可以通过新的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。
你从哪里找到32位字符?我也想要一些! – configurator 2009-02-23 22:49:54
严格来说,我认为它们不存在,但UTF-32使用它们作为便利,即使它只需要大约24位每个字符。 :) 虽然这很奇怪 - 我怀疑windows使用UTF-16,所以很奇怪为什么他们限制为64个字符。也许他们允许替代品? – Arafangion 2009-02-23 23:07:05