2010-03-26 23 views
5

Tôi mới ở Silverlight và tôi đang thực hiện một số thử nghiệm. Với thử nghiệm hiện tại của tôi, tôi cố gắng hiển thị trong thời gian thực nội dung Clipboard hiện tại. Nhưng có một hành vi kỳ lạ với mã này:Không cho phép truy cập "Silverlight 4 Clipboard Security Exception"?

namespace SilverlightTest 
{ 
public partial class MainPage : UserControl 
{ 
    private Timer _timer; 

    public MainPage() 
    { 
     InitializeComponent(); 
     var dispatcher_timer = new DispatcherTimer {Interval = new TimeSpan(0, 0, 0, 5)}; 
     dispatcher_timer.Tick += new EventHandler(timer_Callback); 
     dispatcher_timer.Start(); 
    } 

    private void timer_Callback(object state, EventArgs eventArgs) 
    { 
     current_clip_board.Content = Clipboard.GetText(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     current_clip_board.Content = Clipboard.GetText(); 
    } 
} 
} 

Nút Sự kiện và hẹn giờ Sự kiện được giả định thực hiện chính xác hành động tương tự. Nhưng nó không! Nút hoạt động tốt và thiết lập các văn bản vào clipboard vào nhãn nhưng giờ ném một ngoại lệ:

truy cập Clipboard không được phép

Câu hỏi đặt ra là: tại sao? :)

Cảm ơn.

PS: Tôi sẽ đặt cược vào một vấn đề chủ đề: p

Trả lời

4

Truy cập Clipboard, trong một ứng dụng Silverlight (trong trình duyệt) tin tưởng một phần (trong trình duyệt) có thể bị hạn chế. Thuộc tính GetText chỉ có thể truy cập trong các tình huống mà thời gian chạy Silverlight xác định được khởi tạo bởi người dùng. Ví dụ của bạn là hoàn hảo - bằng một nút bấm ví dụ. Tuy nhiên, thuộc tính này không phải do người dùng khởi tạo, do đó thuộc tính này sẽ tạo ra một ngoại lệ (điều này đặc biệt quan trọng trong ngữ cảnh của một ứng dụng trong trình duyệt, có thể là một lỗ hổng bảo mật lớn nếu bạn có thể tạo một ứng dụng Silverlight. trình duyệt, xem cập nhật clipboard của người dùng mà họ không biết).

Xem chi tiết clipboard documentation để biết thêm chi tiết.

+0

Cảm ơn. Có cách nào để bỏ qua hạn chế này không? Tôi không muốn hack nhưng, đây có thể là một tính năng không thể thiếu đối với ứng dụng mà tôi muốn xây dựng ... –

+0

@Niklaos: Cách duy nhất xung quanh hạn chế này là phải cài đặt ứng dụng dưới dạng ứng dụng trình duyệt có độ cao Lòng tin. – AnthonyWJones

+1

Cũng lưu ý rằng khay nhớ tạm thời Silverlight chỉ giới hạn ở văn bản. – WiredPrairie

1

Các bạn đã thử này:

private void timer_Callback(object state, EventArgs eventArgs) 
{ 
    Dispatcher.Invoke(new System.Threading.ThreadStart(delegate() 
    { 
     current_clip_board.Content = Clipboard.GetText(); 
    } 
} 

chỉnh sửa

Sau khi tìm kiếm nhanh chóng, dường như Clipboard chỉ có sẵn để phản hồi lại hành động của người dùng, hãy xem herehere.

Trong tin tưởng một phần (chế độ mặc định cho Silverlight dựa trên ứng dụng trình duyệt lưu trữ), Silverlight cũng hạn chế truy cập vào clipboard để hai chìa khóa API gettext và setText của nó. Các API này chỉ có thể được gọi từ trong một ngữ cảnh được xác định theo thời gian chạy là Silverlight để phản hồi đối với hành động do người dùng thực hiện. Ví dụ: , quyền truy cập khay nhớ tạm thời hợp lệ từ bên trong trình xử lý cho sự kiện Nhấn hoặc KeyDown. Ngược lại, việc truy cập clipboard không hợp lệ từ trình xử lý cho Đã tải hoặc từ một hàm tạo và các lần truy cập ném ngoại lệ.

+1

Dispatcher.Invoke tạo ra một lỗi biên dịch. BeginInvoke biên dịch nhưng ngoại lệ tương tự được tạo ra bởi cùng một dòng:/Bất kỳ ý tưởng khác? –

1

Nếu tùy chọn duy nhất của bạn là sử dụng bộ hẹn giờ, thì đừng làm gì cả. Clipboad là một tài nguyên được chia sẻ và bạn sẽ tăng các lỗi "không thể mở khay nhớ tạm" trong các chương trình khác khi chúng cố gắng truy cập vào khay nhớ tạm. tức là người dùng sao chép một cái gì đó từ WinWord, WinWord cố mở khay nhớ tạm, nhưng không thể, vì bạn đã khóa nó trong khi đang kiểm tra nó.

+0

Thật tuyệt khi biết! Tôi không muốn sử dụng một bộ đếm thời gian (nó khá xấu xí) nhưng có một số cách khác? Có vẻ như Microsoft đã quên sự kiện "ClipboardUpdated": p –

+0

Không có ý tưởng, vì tôi không biết Silverlight. Tôi đã có rất nhiều kinh nghiệm ở đầu kia của thứ này. Tìm kiếm bất kỳ loại tham chiếu nào đến Trình xem Clipboard hoặc WM_DrawClipboard, trong tài liệu API. Ngoài ra, hãy hiểu rằng cuộc gọi GetText() của bạn sẽ làm cho một tin nhắn WM_RenderFormat được gửi đến ứng dụng đã sao chép (nếu họ sử dụng "Delayed Rendering" mà hầu hết các ứng dụng lớn đều làm), vì vậy bạn sẽ thêm vào những rắc rối của mình theo cách đó cũng như, bằng cách đảm bảo rằng bất cứ điều gì bạn vừa cố gắng lấy, sẽ khiến ứng dụng cung cấp muốn mở lại khay nhớ tạm. Và thất bại. –

+1

Microsoft đã cung cấp thông báo cập nhật clipboard cho ứng dụng Win32 gốc (WM_CLIPBOARDUPDATE). Nhưng, đối với ứng dụng Silverlight đa nền tảng, bạn không có quyền truy cập vào thông báo/chức năng này (đặc biệt trong ngữ cảnh của ứng dụng trong trình duyệt, đây sẽ là vấn đề bảo mật lớn nếu bạn có thể viết mã âm thầm trong trình duyệt, xem cập nhật về clipboard của người dùng mà họ không biết). – WiredPrairie

2

Chỉ kích hoạt Clipboard.ContainsText() thay cho Văn bản. Phương thức ContainsText được cho phép!

0

Xin chào này làm việc cho tôi nhưng chỉ trong IE Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() => HtmlPage.Window.Eval("window.clipboardData.setData('Text','testtestest')"));

chỉ cần sử dụng phương pháp getData

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