2010-02-11 87 views
4

我正在閱讀文本框中的文字,通過模擬高亮度所需的按鍵並複製文本。當我完成後,我希望剪貼板完全符合我的發現。如何保存剪貼板的副本,然後還原爲它?

我希望我能夠做這樣的事情:

IDataObject clipboardBackup = Clipboard.GetDataObject(); 
Clipboard.Clear(); 
//Save other things into the clipboard here, etc// 
Clipboard.SetDataObject(clipboardBackup); 

但是,這似乎並沒有工作。它看起來像你可以走專門嘗試文字,音頻,圖片等路線,然後相應地保存它們。 (我猜'數據對象'在我的例子中也是這樣的,我希望它是通用的。)

我不希望爲每種可能的剪貼板數據類型使用例子,以確保我不會丟失數據而不管格式。

任何提示抓取任何和所有的剪貼板,然後恢復它?

+3

也許這裏的問題是使用剪貼板。你能否更多地解釋爲什麼你選擇了這條路線以及你想要達到的目標?從文本框中讀取單詞似乎不是一個應該需要使用剪貼板的任務... – ZombieSheep 2010-02-11 08:55:18

+0

它從* ANY *文本框中讀取文本。不只是從我的應用程序或其他什麼,所以(我不認爲)我有權訪問我想要的文本框。如果我錯了,我很樂意不能做這個複製/粘貼的東西。 – cksubs 2010-02-11 08:59:46

回答

3

除非直接由登錄用戶指示,否則請勿使用剪貼板。它不適用於一般的應用程序存儲 - 它是供用戶使用它們想要剪輯的內容。

如果您想從任意文本框中獲取文本,請找到該窗口(在Win32中)併發送一個EM_GETTEXT Win32消息。

-1

如果我處於您的位置,我會考慮恢復剪貼板的要求。通常情況下,剪貼板上的數據量將會相對較小(文本塊,網站圖像等),但您偶爾會遇到這樣一種情況,即用戶已經在剪貼板上放置了大量的數據,可能前一段時間,並且可能不再需要。您的應用程序必須足夠強大,才能應對在您的操作生命週期中臨時存儲所有數據。我個人認爲這不太可能是值得的,儘管你比我知道的情況要好得多。

總之,不要。完成後請清除剪貼板Clipboard.Clear();

+1

不是我的失望,但這樣做*會讓用戶討厭應用程序。剪貼板和它上面的數據屬於用戶,而不是任何使用它的任意應用程序。 – AakashM 2010-02-11 09:17:51

+0

是的,我原則上同意,但是使用剪貼板這一整個領域是一個非常棘手的領域 - 我知道,因爲我必須在過去這樣做。最後,在我的情況下,犧牲剪貼板上的單個數據被認爲是值得的。這就是爲什麼我主張OP進行進一步的分析,以確保在將自己的頭髮撕掉之前確實存在需求。 – ZombieSheep 2010-02-11 09:22:09

2

下面的文章介紹了一些用於備份和恢復剪貼板的代碼。除了人們可以想象的還有更多,所以我不會在這裏重新發布代碼。

Clipboard Backup In C#

2

這是不可能完全恢復,在使用延遲渲染的情況下,剪貼板,或在剪貼板中的數據實際上包含指針回不打算供其他程序使用這些本地程序(啞,但我見過它)。考慮一下Excel的典型例子,它使用延遲渲染來提供數十種不同格式的相同選擇,包括Bitmap和HTML等危險內容(如果複製數千個單元格,則可能會消耗數百MB和幾分鐘的時間進行渲染) 。 然後就是其他剪貼板查看器對剪貼板操作作出反應的整個情況。他們會得到重複的數據,更改的數據或通知剪貼板已被刪除。
我覺得這個總結得非常好:


- 查爾斯Petzold的,編程Windows 3「程序不應數據,而無需來自用戶的明確指令轉移到我們的出剪貼板的。」1,Microsoft Press,1992

0

我已經用C++實現了一個示例。

#include "stdafx.h" 
#include "TestClip.h" 
#include <Windows.h> 
#include <queue> 

using namespace std; 

typedef struct 
{ 
UINT format; 
LPVOID content; 
SIZE_T size; 
} ClipBoardItem; 

void InspectClipboard() 
{ 
UINT uFormat = 0; 
HGLOBAL hglb; 
LPVOID hMem; 
float totalSize = 0; 

if (!OpenClipboard(NULL)) 
{ 
    cout << "Open clipboard failed!" << endl; 
    system("pause"); 
    return; 
} 

int countFormat = CountClipboardFormats(); 
cout << "Clipboard formats count: " << countFormat << endl; 

uFormat = EnumClipboardFormats(uFormat); 
while (uFormat) 
{ 
    cout << "Clipboard format:" << uFormat; 
    hglb = GetClipboardData(uFormat); 
    if (hglb != NULL) 
    { 
     hMem = GlobalLock(hglb); 
     SIZE_T size = GlobalSize(hMem); 
     cout << ", size:" << size << endl; 
     totalSize += size; 
     if (hMem != NULL) 
     { 
      GlobalUnlock(hglb); 
     } 
    } 
    else 
    { 
     cout << " data is NULL" << endl; 
    } 
    uFormat = EnumClipboardFormats(uFormat); 
} 
CloseClipboard(); 

string unit = "bytes"; 
if (totalSize >= 1024) 
{ 
    totalSize /= 1024; 
    unit = "KB"; 
} 
if (totalSize >= 1024) 
{ 
    totalSize /= 1024; 
    unit = "MB"; 
} 
if (totalSize >= 1024) 
{ 
    totalSize /= 1024; 
    unit = "GB"; 
} 
cout << "Total size is: " << totalSize << " " << unit.data() << endl; 
} 

queue<ClipBoardItem> BackupClipboard() 
{ 
queue<ClipBoardItem> clipQueue; 
UINT uFormat = 0; 
HGLOBAL hglb; 
LPTSTR lptstr; 
LPVOID hMem; 
if (!OpenClipboard(NULL)) 
{ 
    cout << "Open clipboard failed" << endl; 
    return clipQueue; 
} 

uFormat = EnumClipboardFormats(uFormat); 
while (uFormat) 
{ 
    cout << "Backup clipboard format:" << uFormat << endl; 
    hglb = GetClipboardData(uFormat); 
    if (hglb != NULL) 
    { 
     hMem = GlobalLock(hglb); 
     SIZE_T size = GlobalSize(hMem); 
     if (size > 0) 
     { 
      ClipBoardItem clipitem; 
      clipitem.format = uFormat; 
      clipitem.content = malloc(size); 
      clipitem.size = size; 
      memcpy(clipitem.content, hMem, size); 
      clipQueue.push(clipitem); 
     } 

     if (hMem != NULL) 
     { 
      GlobalUnlock(hglb); 
     } 
    } 
    uFormat = EnumClipboardFormats(uFormat); 
} 
EmptyClipboard(); 
CloseClipboard(); 
cout << "Clipboard has been cleaned" << endl; 
return clipQueue; 
} 

void RestoreClipboard(queue<ClipBoardItem> clipQueue) 
{ 
if (!OpenClipboard(NULL)) return; 

while (!clipQueue.empty()) 
{ 
    ClipBoardItem clipitem = clipQueue.front(); 
    HGLOBAL hResult = GlobalAlloc(GMEM_MOVEABLE, clipitem.size); 
    if (hResult == NULL) 
    { 
     cout << "GlobalAlloc failed" << endl; 
     clipQueue.pop(); 
     continue; 
    } 
    memcpy(GlobalLock(hResult), clipitem.content, clipitem.size); 
    GlobalUnlock(hResult); 
    if (SetClipboardData(clipitem.format, hResult) == NULL) { 
     cout << "Set clipboard data failed" << endl; 
    } 
    cout << "Resotred clipboard format:" << clipitem.format << endl; 
    GlobalFree(hResult); 
    free(clipitem.content); 
    clipQueue.pop(); 
} 
CloseClipboard(); 
} 

int _tmain(int argc, TCHAR* argv [], TCHAR* envp []) 
{ 
InspectClipboard(); 
cout << "Press any key to backup and empty clipboard" << endl; 
system("pause"); 

queue<ClipBoardItem> clipQueue = BackupClipboard(); 
InspectClipboard(); 
cout << "Press any key to restore clipboard" << endl; 
system("pause"); 
RestoreClipboard(clipQueue); 
cout << "Clipboard has been restored" << endl; 
system("pause"); 
InspectClipboard(); 
system("pause"); 
return 0; 
} 

希望這有助於!