2009-02-23 40 views

Trả lời

24

Thực ra, đó là lỗi trong trình thiết lập thuộc tính cho thuộc tính Văn bản. Khai báo P/Invoke cho NOTIFYICONDATA bên trong Windows Forms sử dụng giới hạn 128 char. Bạn có thể hack xung quanh nó với 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 }); 
     } 
    } 
+0

Bất kỳ hack nào cho C++? –

+0

Không cần hack, bạn chỉ cần đặt macro WINVER chính xác để trình biên dịch biết rằng bạn đang nhắm mục tiêu ít nhất Windows 2000. –

+0

Xin lỗi, tôi muốn vượt qua giới hạn tương tự trong 'szInfoTitle', đặt tiêu đề cho cửa sổ bật lên bong bóng . Có cách giải quyết nào cho điều đó không? –

-4

bk1e ở đây cho biết giới hạn là 128 ký tự, bây giờ, nếu bạn sử dụng UTF-16, là định dạng unicode gốc trong cửa sổ và đặc biệt là .NET, nghĩa là bạn bị giới hạn ở 64 ký tự, bao gồm NUL .

Tôi tin rằng bạn đang sử dụng API unicode giới hạn chú giải công cụ thành 64 ký tự 16 bit (bao gồm cả null) và máy chủ VNC sử dụng lệnh ascii (hoặc ANSI) của api, cho phép sử dụng 128 8- ký tự bit (bao gồm cả null).

EDIT: Câu trả lời này là sai, đây là một lời nhận xét hữu ích bởi Cody Grey giải thích tại sao:

lập luận này là hấp dẫn, nhưng không thực sự chính xác. Khi tài liệu MSDN nói về "ký tự", nó thực sự có nghĩa là số lượng các mục char hoặc wchar_t trong mảng (tùy thuộc vào việc bạn đang nhắm mục tiêu Unicode). Vì vậy, bạn nhận được 128 ký tự được hứa hẹn khi chạy trên Windows 2000+. Windows 9x được giới hạn trong 64 ký tự. - Cody Grey 19 Tháng Sáu tại 04:11"

+0

Bạn tìm thấy các ký tự 32 bit ở đâu? Tôi cung muôn một IT! – configurator

+0

Tôi không nghĩ rằng chúng tồn tại, nói đúng, nhưng UTF-32 sử dụng chúng như một sự tiện lợi mặc dù nó chỉ cần khoảng 24 bit cho mỗi ký tự. :) Thật lạ lùng, mặc dù - tôi nghi ngờ rằng các cửa sổ sử dụng UTF-16, vì vậy, đó là lý do tại sao họ đã giới hạn nó đến 64 ký tự. Có lẽ họ cho phép thay thế? – Arafangion

+1

Tôi chỉ nghi ngờ rằng đây là giới hạn nhảm nhí điển hình. Một người nào đó ở MS đến với 64 ký tự và đó là cách nó được. Không có khoa học tên lửa liên quan, hoặc đơn giản là không có giới hạn như thế này. – ypnos

8

Từ các tài liệu MSDN trên Win32 NOTIFYICONDATA structure:

szTip

Một chuỗi null-chấm dứt chỉ định văn bản cho một tiêu chuẩn Chú giải công cụ. Nó có thể có tối đa 64 ký tự, bao gồm ký tự kết thúc null.

Đối với Windows 2000 (Shell32.dll phiên bản 5.0) và sau đó, szTip có thể có tối đa 128 ký tự, bao gồm ký tự kết thúc null.

Dường như thư viện Windows Forms hỗ trợ mẫu số chung thấp nhất tại đây.

1

Mở rộng câu trả lời đúng của bk1e.

Dưới mui xe, biểu tượng khay hệ thống trong WinForms được triển khai dưới dạng Biểu tượng thông báo Win32. Do đó, phiên bản winforms có tất cả các giới hạn như là bản gốc. Giới hạn kích thước chú giải công cụ chỉ là một ví dụ.

1

Gần đây tôi đã gặp một vấn đề tương tự. Thay vì hack back-end, tôi đã triển khai một work-around, sử dụng BalloonTipText, có thể chứa khá nhiều nhân vật.

Chú giải công cụ được hiển thị trên sự kiện MouseMove đầu tiên trên biểu tượng khay và chú giải công cụ được hiển thị trong 2 giây. Atter tooltip được đóng lại, nó có thể được mở lại bằng một sự kiện MouseMove mới.

Nhược điểm duy nhất với giải pháp này là không thể đóng bóng theo chương trình, khi người dùng nói rời khỏi khu vực biểu tượng, vì vậy nó chỉ biến mất sau khi hết giờ hoặc nếu người dùng nhấp vào X nhỏ nút.

Lưu ý rằng tiêu đề và văn bản có thể được đặt bất cứ lúc nào ở nơi khác trong chương trình. Chúng được đặt ở đây trong sự kiện chỉ cho mục đích trình diễn.

CHỈNH SỬA:ShowBalloonTip() bổ sung cháy tầng tầng MouseMove sự kiện, vì vậy cần phải tắt sự kiện này cho đến khi chú giải công cụ bóng được ẩn. Ngoài ra, BalloonTipClosed là (theo the documentation) chỉ được kích hoạt khi người dùng chủ động nhấp vào 'X', mặc dù tôi đã quan sát thấy nó được kích hoạt khi chú giải công cụ đóng sau một thời gian chờ. Do đó, tôi đã thêm một bộ đếm thời gian trợ giúp để thiết lập lại sate, thay vì dựa vào sự kiện BalloonTipClosed. Mã sửa đổi và thử nghiệm dưới:

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: Một ảnh chụp màn hình của một tooltip bóng với khá nhiều văn bản, mà sử dụng giải pháp này có thể seen in by blog.

Các vấn đề liên quan