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ここでは、Windowsとネイティブのユニコード形式のUTF-16を使用すると128文字に制限されていると言います。つまり、NULを含む文字に限定されています。 。
私はツールチップを64個の16ビット文字(nullを含む)に制限するユニコードAPIを使用していると思いますし、VNCサーバはascii(またはANSI)apiを代わりに使用し、 (nullを含む)。
編集:この答えは間違っている、ここに理由を説明コーディグレイ役に立つコメントです:
この推論は説得力があるが、実際には正しくありません。 MSDNのドキュメントで「文字」について語るとき、実際には配列内のcharまたはwchar_t項目の数を意味します(Unicodeをターゲットにするかどうかによって異なります)。したがって、Windows 2000以降で動作することを約束した128文字を取得できます。 Windows 9xは64文字に制限されていました。 - 4時11" 分
32ビット文字はどこですか?私もいくつかしたい! – configurator
私はそれらが存在するとは思えませんが、厳密に言えば、UTF-32は1文字につき約24ビットしか必要ないものの、それらを便宜的に使用します。 :) WindowsはUTF-16を使用していると思われるので、64文字に制限されているのは不思議です。彼らは代理人を許可しているのだろうか? – Arafangion
私はこれが典型的な間抜けの限界であると思われます。 MSの誰かが64文字を思いついた、それはそうだ。ロケット科学は関与していないし、単にこのような限界がないだろう。 – ypnos
でコーディグレー6月19日のWin32 NOTIFYICONDATA structure上のMSDNドキュメントから:
szTip
標準のテキストを指定するNULLで終わる文字列 ツールヒント。末尾の ヌル文字を含む、最大で 文字を持つことができます。
Windows 2000(Shell32.dllバージョン5.0)以降では、szipは の終了ヌル文字を含めて、 に最大128文字を含めることができます。
ここではWindowsフォームライブラリが最低限の分母をサポートしているようです。
bk1eの正解で拡張しています。
WinFormsのシステムトレイアイコンは、Win32通知アイコンとして実装されています。したがって、winformsのバージョンには、すべての制限事項があります。ツールチップサイズの制限は、単なる一例に過ぎません。
私は最近、同様の問題に遭遇しました。バックエンドをハッキングするのではなく、BalloonTipTextを使用する回避策を実装しました。BalloonTipTextは非常に多くの文字に対応できます。
最初のMouseMoveイベントのトレイアイコンの上にツールチップが表示され、ツールチップが2秒間表示されます。ツールチップを閉じると、新しいMouseMoveイベントによって再度開くことができます。
この解決策の唯一の欠点は、ユーザーが例えばアイコン領域を離れるときにバルーンをプログラムで閉じることができないため、タイムアウト後に消えるか、ユーザーが小さいX-ボタン。
タイトルとテキストは、プログラムのいつでも設定できます。ここではデモンストレーション目的でのみ設定されています。
EDIT:MouseMove
イベントをカスケード接続ShowBalloonTip()
火災のほか、そのバルーンツールチップなどの時間が非表示になるまで、このイベントを無効にする必要があります。さらに、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;
}
EDIT 2:このソリューションはseen in by blogを利用することができ、テキストの非常に多くを持つバルーンツールチップのスクリーンショット。
C++のハックはありますか? –
ハックは必要ありません.Windowマクロを正しく設定して、コンパイラが少なくともWindows 2000を対象としていることを知っておく必要があります。 –
申し訳ありませんが、私は 'szInfoTitle'の似たような制限を乗り越えたいと思います。 。それにも回避策はありますか? –