我會盡我所能詳細解釋我想要達到的目標。如何在C#中備份和恢復系統剪貼板?
我正在使用C#與IntPtr窗口句柄來執行從我自己的C#應用程序的外部應用程序的CTRL-C複製操作。我必須這樣做,因爲沒有辦法直接使用GET_TEXT訪問文本。然後我在應用程序中使用該副本的文本內容。這裏的問題是我現在覆蓋了剪貼板。
我想做些什麼可以做的是:
- 備份本來可以通過設置比我自己以外的任何應用程序剪貼板的原始內容。
- 然後執行復制並將值存儲到我的應用程序中。
- 然後恢復剪貼板的原始內容,以便用戶仍可訪問其原始剪貼板數據。
這是迄今爲止我已經試過代碼:
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
}
}
我使用的System.Windows.Clipboard而不是System.Windows.Forms.Clipboard。原因是當我執行CTRL-C時,System.Windows.Forms中的Clipboard類沒有返回任何數據,但系統剪貼板沒有。
我看了一些像OpenClipboard,EmptyClipboard和CloseClipboard的低級別的user32調用,希望他們會幫助我做到這一點,但到目前爲止,我仍然在嘗試恢復時收到COM異常。
我想也許這與OpenClipboard參數有關,該參數需要應用程序的IntPtr窗口句柄來控制剪貼板。由於我提到我的應用程序沒有GUI,這是一個挑戰。我不知道該通過什麼。也許有人可以對此有所瞭解?
我是否正確使用剪貼板類?有沒有一種清晰的方式來獲得沒有GUI的應用程序的IntPtr窗口句柄?有誰知道備份和恢復系統剪貼板的更好方法嗎?
我遇到了同樣的錯誤,發現這個職位。但是,只有在調用Clipboard.GetDataObject()。SetData(myData)時纔會出現此錯誤。如果我調用Clipboard.SetDataObject(myData),它工作正常。任何解釋爲什麼?如果它很重要,我的應用程序是基於WPF的。 – newman 2013-06-19 20:25:35