テキストをクリップボードにコピーする

テキストボックスに入力されたテキストをクリップボードにコピーするならば
CEditクラスのCopy()等のメンバ関数で簡単にコピーできます。
しかし、エディットボックスを持たない場合はこの方法は使えません。
非表示でエディットボックスを作成して・・・という方法も有りますがスマートじゃないです。
それにテキスト以外をコピーする場合もこの方法では出来ませんし。
そこでクリップボードを直接操作する関数を使っていきます。

まずはクリップボードにコピーするデータについてですがこのデータは
グローバルメモリのハンドルでなければなりません。
テキストをコピーするならばGlobalAlloc()を使って確保したメモリのハンドルになります。
このとき確保するメモリは移動可能メモリでGMEM_DDESHAREを指定しなければなりません。
そしてGlobalLock()でメモリブロックをの先頭ポインタを取得しデータをコピーし
GlobalUnlock()でアンロックしておきます。
コピーするデータが作成できたらOpenClipboard()でクリップボードを開き
EmptyClipboard()を呼び出しクリップボードの中身を空にして
SetClipboardData()でデータをクリップボードにコピーして
最後にCloseClipboard()でクリップボードを閉じて終了です。
この4つの作業はできるだけ短い期間で終える必要があります。
クリップボードをオープンすると、その間他のアプリケーションで使えませんからね。

以上の処理を関数にするとこんな感じになります。


BOOL CTestWnd::CopyToClipboard(LPCTSTR lpString)
{
    HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE,
                                 strlen(lpString) + 1);
    if (!hMem)
        return FALSE;
    if (::lstrcpy((char*)::GlobalLock(hMem), lpString) && OpenClipboard())
    {
        ::GlobalUnlock(hMem);
        if (::EmptyClipboard())
        {
            if (::SetClipboardData(CF_TEXT, hMem))
            {
                ::CloseClipboard();
                return TRUE;
            }
        }
        ::CloseClipboard();
    }
    ::GlobalFree(hMem);
    return FALSE;
}

注意点としてクリップボードにハンドルをセットしたらそれ以降そのハンドルは使用できません。
ハンドルを渡すとそれ以降はOSがハンドルを管理するようになる為です。
ですのでハンドルはロックしていたり最後にGlobalFree()で開放してはいけません。
もちろん、もしクリップボードを開けなかったりしてセットできなかった場合はきちんと開放してください。

< 戻る << HOME ©1999-2002 by Akky, All right reserved.