[kaze's test] プログラミングメモ →目次

クリップボードの使用(VC++)

1.クリップボードへデータをコピーしたり、クリップボードからデータを取得したりする為に、データ形式の登録が必要です。Windowsシステムは既に色んな標準な形式を登録済みです。例えば、テキストデータの場合は、CF_TEXTになっています。独自のデータ形式は、下記のように登録を行います。

#define CFSTR_TEXT_TEST	"TextTest.Format"
//独自のデータ形式
const UINT CF_TEXT_TEST = RegisterClipboardFormat(CFSTR_TEXT_TEST);

2.クリップボードへデータをコピーする方法。データをグローバルメモリにコピーして、メモリのハンドルとデータ形式IDを使って、クリップボードに指定されたデータ形式でデータを入れます。



例:テキストデータを独自の形式でクロップボードに入れます。
void CTestCopyPasteDlg::OnButton1() 
{
    char buff[] = "Hello,World.";
    HANDLE hMem = ::GlobalAlloc(GHND, (strlen(buff) + 1));
    if(hMem) 
    {
        LPSTR lpMem = (LPSTR)::GlobalLock(hMem);
        memcpy(lpMem, buff, (strlen(buff) + 1));
        ::GlobalUnlock(hMem);
        if (::OpenClipboard(m_hWnd)) 
        {
            if (::EmptyClipboard())
            {
                if (NULL != ::SetClipboardData(CF_TEXT_TEST, hMem))
                    ::CloseClipboard();
                else
                    ::GlobalFree(hMem);
            }
        }
    }
}

3.クリップボードからトデータを取得する方法。取得したい形式のデータが存在するか確認してから、グローバルメモリからデータを取得します。

例:

void CTestCopyPasteDlg::OnButton2() 
{
    CString strText;
    if (::IsClipboardFormatAvailable(CF_TEXT_TEST)) 
    {
        if (::OpenClipboard(m_hWnd)) 
        {
            HANDLE hData = ::GetClipboardData(CF_TEXT_TEST);
            if (hData) 
            {
                LPSTR lpData =(LPSTR)GlobalLock(hData);
                strText = lpData;
                ::GlobalUnlock(hData);
            }
            ::CloseClipboard();
        }
    }
    AfxMessageBox(strText);
}

4.ちなみに、CF_TEXT_TEST と CF_TEXT を入れ替えれば、普通のテキストのコピー/ペーストになります。