2011-01-09 14 views
3

私は窓のクリップボードで遊んでいます。私はあなたがフォーマットを提供するならばあなたがクリップボードを見ることができることに気づいた。私は、クリップボードの生の内容をダンプできるプログラムを見てきました。私が意味するものの例についてはhttp://www.autohotkey.com/docs/misc/Clipboard.htm#ClipboardAllを見てください。クリップボードのデータをC++でrawフォーマットで取得する

私がしたいことは、クリップボードをバックアップし、操作してから、プログラムが完了したときに復元することです。

私はそれが実際に事

EDITだ場合non-.net解決策を探しています

struct clipData { 
vector<void*> data; 
vector<int> size; 
}; 

struct clipData saveClipboard(int &size) { 
clipData ret; 
UINT currentFormat = 0; 
HGLOBAL hData; 
if (OpenClipboard(0)) { 

    while(currentFormat = EnumClipboardFormats(currentFormat)) { 
    hData = GetClipboardData(currentFormat); 
    int currentClipboardFormatSize = GlobalSize(hData); //Only works with text formats. Help! 
    char *savedClipboardData = new char[currentClipboardFormatSize]; 
    char *ptrToData = (char*) GlobalLock(hData); 
    memcpy(savedClipboardData, ptrToData, currentClipboardFormatSize); 
    ret.data.push_back(savedClipboardData); 
    ret.size.push_back(currentClipboardFormatSize); 
    } 
    CloseClipboard(); 
} 
return ret; 
} 

しかし、問題は、theresの方法はありません:

私はこれまでのところ、これを試してみましたクリップボードの大きさを各形式で表します。

答えて

4

「未処理」のデータはありません。ちょうどenumerate all the formats currently on the clipboardを取得し、各形式の内容を取得して保存します。ただし、自動フォーマット変換には注意が必要です。

リンクされた自動ホットキーのマニュアルを慎重に読んでも、各フォーマットを別々に取得していることがわかり、フォーマットのサブセットの取得にのみ成功する可能性があります。

+0

@ Dave18これまでに試したことを貼り付けて、それが私の主な問題です – qwertymk

+3

この手順はフォーマットによって異なります。[標準クリップボード形式](http://msdn.microsoft.com/en-us/library/ff729168)を参照してください。 aspx)。範囲(CF_GDIOBJFIRST〜CF_GDIOBJLAST)のフォーマットとプライベートフォーマットはすべて 'GlobalAlloc'を使用するので、' GlobalSize'と 'GlobalLock'への呼び出しはうまく動作します(' GlobalLock'への呼び出しは 'GlobalUnlock'と一致します)。 –

+5

'CF_BITMAP'、' CF_ENHMETAFILE'、 'CF_HDROP'のようなフォーマットに注意してください - クリップボード上のオブジェクトは' HBITMAP'、 'HENHMETAFILE'、' HDROP'です* '* HGLOBAL'ではありません! –

2

MSDNには、クリップボードAPIを使用してクリップボードデータを操作するために必要なすべての例があります。

関連する問題