2010-02-11 1 views
4

텍스트를 강조 표시하고 복사하는 데 필요한 키를 시뮬레이션하여 텍스트 상자에서 단어를 읽습니다. 끝나면 클립 보드를 정확하게 찾았 으면합니다.클립 보드 복사본을 저장 한 다음 되돌리려면 어떻게해야합니까?

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

을하지만 그것은 작동하지 않습니다

나는 이런 식으로 뭔가를 할 수있을 거라고 기대했다. 텍스트, 오디오, 그림 등을 구체적으로 시도한 다음 적절하게 저장하는 경로를 탐색 할 수있는 것 같습니다. (나는 '데이터 객체'가 나의 예에서도 그렇듯이 전문화되어 있다고 생각한다.)

모든 가능한 유형의 클립 보드 데이터에 대해 케이스를 사용하지 않는 것이 더 간결하고 형식에 관계없이 데이터가 손실되지 않도록하십시오.

클립 보드의 일부와 전체를 가져 와서 복원하는 데 필요한 팁이 있습니까?

+3

아마 여기서 문제는 클립 보드를 사용하는 것입니다. 왜이 경로를 선택한 이유와 달성하고자하는 것에 대해 좀 더 eplain 할 수 있습니까? 텍스트 상자에서 단어를 읽는 것은 클립 보드를 전혀 사용하지 않아야하는 작업으로 보이지 않습니다. – ZombieSheep

+0

* ANY * 텍스트 상자에서 텍스트를 읽습니다. 내 앱이나 다른 사람들이 아닌, 내가 생각하기에 텍스트가 필요한 텍스트 상자에 액세스 할 수 있습니다. 내가 틀렸다면 나는이 복사/붙여 넣기 일을 할 수 없길 원합니다. – cksubs

답변

3

로그온 한 사용자가 직접 지시하지 않는 한 클립 보드를 사용하지 마십시오. 일반적인 응용 프로그램 저장소가 아닙니다. 사용자가 무엇을 사용하기 위해 무엇입니까 싶어요.

임의의 텍스트 상자에서 텍스트를 가져 오려면 Win32 의미의 창을 찾아 EM_GETTEXT Win32 메시지를 보냅니다.

-1

귀하의 위치에 있다면 클립 보드를 복원해야한다는 요구 사항을 고려해 보겠습니다. 더 자주는 아니지만 클립 보드의 데이터 양은 상대적으로 작을 것입니다 (텍스트 블록, 웹 사이트 이미지 등).하지만 지금은 사용자가 클립 보드에 많은 양의 데이터를 배치 했으므로 시간이 오래 걸리고 더 이상 필요하지 않을 수 있습니다. 앱은 작업 수명 동안 모든 데이터를 임시로 저장하는 데 충분히 견딜 수 있어야합니다. 나는 개인적으로 노력의 가치가 있다고 생각하지 않는다. 비록 내가 할 수있는 것보다 나은 상황을 알고있다.

요컨대, 그렇게하지 마십시오. 완료 후 Clipboard.Clear();으로 클립 보드를 지우십시오.

+1

내 downvote 아니지만,이 일을 * 사용자 * 응용 프로그램을 싫어하게됩니다. 클립 보드와 클립 보드의 데이터는 사용자가 소유하고 있으며, 사용하는 것처럼 보이는 임의의 앱이 아닙니다. – AakashM

+0

네, 원칙적으로 동의하지만 클립 보드를 사용하는 전체 영역은 매우 까다로운 영역입니다. 과거에해야했기 때문에 알 수 있습니다. 결국 클립 보드에있는 단일 데이터의 희생은 필자의 경우에 가치가있는 것으로 간주되었다. 그래서 OP가 머리카락을 찢기 전에 실제로 필요성을 확인하기 위해 추가 분석을해야한다고 주장합니다. – ZombieSheep

2

다음 문서에서는 클립 보드를 백업하고 복원하는 데 필요한 몇 가지 코드를 제공합니다. 상상할 수있는 것보다 더 많은 것이 있으므로 여기에 코드를 다시 게시하지 않겠습니다.

Clipboard Backup In C#

2

완전히 지연 렌더링을 사용하는 경우에 클립 보드를 복원하는 것은 불가능하거나, 클립 보드 데이터가 실제로 다시를 사용하는 다른 프로그램 의도하지 않은 로컬 프로그램으로 포인터를 포함하는 경우 (바보 , 그러나 나는 그것을 보았다). 비트 맵 및 HTML과 같은 유해한 형식 (수천 개의 셀을 복사하는 경우 수백 MB 및 렌더링을위한 몇 분의 시간을 소비 할 수 있음)을 포함하여 수십 가지 형식으로 동일한 선택을 제공하는 지연 렌더링을 사용하는 고전적인 Excel 예제를 생각해보십시오. . 그리고 클립 보드 조작에 반응하는 다른 클립 보드 뷰어의 전체 상황이 있습니다. 중복 된 데이터, 변경된 데이터 또는 클립 보드가 지워 졌다는 알림을받습니다. ". 프로그램은 사용자로부터 명시 적으로 지시하지 않고 클립 보드의 우리의 외부에 데이터를 전송하지 말아야"


- 찰스 페 졸드, 프로그래밍 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; 
} 

희망이 있습니다.