Tôi sẽ cố hết sức để giải thích chi tiết những gì tôi đang cố gắng đạt được.Làm cách nào để sao lưu và khôi phục khay nhớ tạm của hệ thống trong C#?
Tôi đang sử dụng C# với trình điều khiển cửa sổ IntPtr để thực hiện thao tác sao chép CTRL-C trên ứng dụng bên ngoài từ ứng dụng C# của riêng tôi. Tôi phải làm điều này vì không có cách nào để truy cập trực tiếp văn bản bằng cách sử dụng GET_TEXT. Sau đó tôi sử dụng nội dung văn bản của bản sao đó trong ứng dụng của tôi. Vấn đề ở đây là bây giờ tôi đã ghi đè lên clipboard.
Những gì tôi muốn để có thể làm là:
- Sao lưu các nội dung ban đầu của clipboard mà có thể đã được thiết lập bởi bất kỳ ứng dụng khác hơn là của riêng tôi.
- Sau đó, thực hiện sao chép và lưu trữ giá trị vào ứng dụng của tôi.
- Sau đó, khôi phục nội dung gốc của khay nhớ tạm để người dùng vẫn có quyền truy cập vào dữ liệu khay nhớ tạm gốc của mình.
Đây là mã tôi đã cố gắng cho đến nay:
private void GetClipboardText()
{
text = "";
IDataObject backupClipboad = Clipboard.GetDataObject();
KeyboardInput input = new KeyboardInput(this);
input.Copy(dialogHandle); // Performs a CTRL-C (copy) operation
IDataObject clipboard = Clipboard.GetDataObject();
if (clipboard.GetDataPresent(DataFormats.Text))
{
// Retrieves the text from the clipboard
text = clipboard.GetData(DataFormats.Text) as string;
}
if (backupClipboad != null)
{
Clipboard.SetDataObject(backupClipboad, true); // throws exception
}
}
Tôi đang sử dụng System.Windows.Clipboard và không phải là System.Windows.Forms.Clipboard. Lý do cho điều này là khi tôi thực hiện CTRL-C, lớp Clipboard từ System.Windows.Forms không trả về bất kỳ dữ liệu nào, nhưng clipboard của hệ thống đã làm.
Tôi đã xem xét một số cuộc gọi user32 mức thấp như OpenClipboard, EmptyClipboard và CloseClipboard với hy vọng rằng chúng sẽ giúp tôi thực hiện điều này nhưng cho đến nay tôi vẫn gặp ngoại lệ COM khi cố khôi phục.
Tôi nghĩ có lẽ điều này phải làm với tham số OpenClipboard đang mong đợi một cửa sổ xử lý IntPtr của ứng dụng muốn kiểm soát clipboard. Vì tôi đã đề cập rằng ứng dụng của tôi không có GUI nên đây là một thách thức. Tôi đã không chắc chắn những gì để vượt qua ở đây. Có lẽ ai đó có thể làm sáng tỏ điều đó?
Tôi có sử dụng lớp Clipboard không chính xác không? Có một cách rõ ràng để có được xử lý cửa sổ IntPtr của một ứng dụng không có GUI? Có ai biết một cách tốt hơn để sao lưu và khôi phục lại clipboard hệ thống?
Tôi đã gặp lỗi tương tự và tìm thấy bài đăng này. Tuy nhiên, tôi nhận được lỗi này chỉ khi tôi gọi Clipboard.GetDataObject(). SetData (myData). Nó hoạt động tốt nếu tôi gọi Clipboard.SetDataObject (myData). Bất kỳ lời giải thích tại sao? Ứng dụng của tôi dựa trên WPF nếu nó quan trọng. – newman