クリップボードを操作する確実な方法

クリップボードはWindowsの主要な機能の1つです。文字列や画像、オリジナル形式のデータなどを アプリケーションの垣根を越えて扱うための一時的な保存場所である。「コピー&ペースト」として 広く使用されています。クリップボードは多種多様な情報を扱うことができるがここではテキスト形式 (CF_TEXT)を取り扱う方法を説明します。

// クリップボードに文字列を登録する
//
// [引数]
// szText : 登録する文字列
//
// [返値]
// 登録に成功した場合 : TRUE
// 登録に失敗した場合 : FALSE

BOOL SetClipBoardText(char *szText)
{
    HGLOBAL hGMem;

    if (lstrlen(szText) == 0)
        return FALSE;

    if( !OpenClipboard(NULL) )
        return FALSE;

    hGMem = ::GlobalAlloc(GMEM_FIXED, lstrlen(szText) + 1);
    lstrcpy((char *)hGMem, szText);

    EmptyClipboard();
    SetClipboardData(CF_TEXT, hGMem);
    CloseClipboard();

    return TRUE;
}
// クリップボードから文字列を取得する
// 
// [引数]
// szBuffer : 文字列を保存するバッファ
// nBufferSize : バッファサイズ
//
// [返値]
// データが取得できた場合 : TRUE
// データが存在しない or 取得失敗 : FALSE

BOOL GetClipBoardText(char *szBuffer, int nBufferSize)
{
    HANDLE hMem;
    BOOL bRet = TRUE;

    // テキストが登録されているか確認
    if( !IsClipboardFormatAvailable(CF_TEXT) )
        return FALSE;

    if( !OpenClipboard(NULL) )
        return FALSE;

    hMem = ::GetClipboardData(CF_TEXT);
    char* pszClipBoard = (LPTSTR)::GlobalLock(hMem);

    if (lstrlen(pszClipBoard) < nBufferSize) {
        lstrcpy(szBuffer, pszClipBoard);
    } else {
        bRet = FALSE;
    }

    GlobalUnlock(hMem);
    CloseClipboard();

    return bRet;
}

 

Windows API

Posted by @erestage