2009-02-23 11 views

答えて

24

実際には、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 }); 
     } 
    } 
+0

C++のハックはありますか? –

+0

ハックは必要ありません.Windowマクロを正しく設定して、コンパイラが少なくともWindows 2000を対象としていることを知っておく必要があります。 –

+0

申し訳ありませんが、私は 'szInfoTitle'の似たような制限を乗り越えたいと思います。 。それにも回避策はありますか? –

-4

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" 分

+0

32ビット文字はどこですか?私もいくつかしたい! – configurator

+0

私はそれらが存在するとは思えませんが、厳密に言えば、UTF-32は1文字につき約24ビットしか必要ないものの、それらを便宜的に使用します。 :) WindowsはUTF-16を使用していると思われるので、64文字に制限されているのは不思議です。彼らは代理人を許可しているのだろうか? – Arafangion

+1

私はこれが典型的な間抜けの限界であると思われます。 MSの誰かが64文字を思いついた、それはそうだ。ロケット科学は関与していないし、単にこのような限界がないだろう。 – ypnos

8

でコーディグレー6月19日のWin32 NOTIFYICONDATA structure上のMSDNドキュメントから:

szTip

標準のテキストを指定するNULLで終わる文字列 ツールヒント。末尾の ヌル文字を含む、最大で 文字を持つことができます。

Windows 2000(Shell32.dllバージョン5.0)以降では、szipは の終了ヌル文字を含めて、 に最大128文字を含めることができます。

ここではWindowsフォームライブラリが最低限の分母をサポートしているようです。

1

bk1eの正解で拡張しています。

WinFormsのシステムトレイアイコンは、Win32通知アイコンとして実装されています。したがって、winformsのバージョンには、すべての制限事項があります。ツールチップサイズの制限は、単なる一例に過ぎません。

1

私は最近、同様の問題に遭遇しました。バックエンドをハッキングするのではなく、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を利用することができ、テキストの非常に多くを持つバルーンツールチップのスクリーンショット。

関連する問題