プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

クリップボードにテキストを書き込む - funcClipWrite()

2010年02月08日 15時17分00秒 | 便利ライブラリ関数

クリップボードにテキストを書き込むには次の手順で行います。(戻る)

  1. 文字数からバイト数に変換する
  2. グローバル・メモリを確保する(GlobalAlloc)
  3. メモリのハンドルをロックする(GlobalLock)
  4. 引数 lpBuff のデータをコピー(funcCopyString)
  5. メモリのハンドルをロック解除(GlobalUnlock)
  6. クリップボードをオープンする(OpenClipboard)
  7. クリップボードのデータを解放(EmptyClipboard)
  8. クリップボードにメモリを設定(SetClipboardData)
  9. クリップボードをクローズする(CloseClipboard)

funcCopyString は自作関数です。

プロトタイプ宣言

BOOL OpenClipboard(
    HWND hWndNewOwner       // ウインドウのハンドル
);
BOOL CloseClipboard( VOID );

BOOL EmptyClipboard( VOID );

HANDLE SetClipboardData(
    UINT        uFormat     // クリップボードのデータ形式
    HANDLE      hMem        // データのハンドル
);
HGLOBAL GlobalAlloc(
    UINT        uFlags,     // 割り当ての属性
    SIZE_T      dwBytes     // 割り当てたいバイト数
);
HGLOBAL GlobalFree(
    HGLOBAL     hMem        // グローバル・メモリのハンドル
);
LPVOID GlobalLock(
    HGLOBAL     hMem        // グローバル・メモリのハンドル
);
BOOL GlobalUnlock(
    HGLOBAL     hMem        // グローバル・メモリのハンドル
);

ANSI/UNICODE両用のクリップボード定数

#ifndef CF_CLIPTEXT
#   ifdef UNICODE
#       define CF_CLIPTEXT      CF_UNICODETEXT
#   else
#       define CF_CLIPTEXT      CF_TEXT
#   endif
#endif

サンプル

// クリップボードにテキストを書き込む
extern BOOL funcClipWrite( HWND hWnd, LPCTSTR lpBuff, DWORD dwSize )
{
    HGLOBAL     hMem;
    LPTSTR      lpClip;
    DWORD       dwByte;
    
    // 文字数からバイト数に変換
    dwByte  = dwSize;
    dwByte *= sizeof(TCHAR);
    dwByte += sizeof(TCHAR);
    
    if ( (hMem = GlobalAlloc((GHND|GMEM_SHARE),dwByte)) != NULL ){
        if ( (lpClip = (LPTSTR)GlobalLock(hMem)) != NULL ){
            funcCopyString( lpClip, (dwSize + 1), lpBuff );
            GlobalUnlock( hMem );
            
            // クリップボードにコピー
            if ( OpenClipboard(hWnd) ){
                EmptyClipboard();
                SetClipboardData( CF_CLIPTEXT, hMem );
                CloseClipboard();
                return TRUE;
            }
        }
        GlobalFree( hMem );
    }
    return FALSE;
}

// 使用例
int main( void )
{
    HWND   hWnd = GetDesktopWindow();
    TCHAR  szBuff[ 1024 ];
    LPTSTR lpBuff = szBuff;
    
    lpBuff += wsprintf( lpBuff, TEXT("1行目:あいうえお\n") );
    lpBuff += wsprintf( lpBuff, TEXT("2行目:かきくけこ\n") );
    lpBuff += wsprintf( lpBuff, TEXT("3行目:さしすせそ\n") );
    
    if ( funcClipWrite(hWnd,szBuff,lstrlen(szBuff)) ){
        printf( TEXT("クリップボードにテキストをコピーしました。\n") );
    }
    else{
        printf( TEXT("クリップボードが開けないか、またはメモリを確保できません。\n") );
    }
    return 0;
}
  • hWnd にウインドウのハンドルを指定します。
  • lpBuff に書き込むテキストのバッファを指定します。
  • dwSize に書き込むテキストのサイズ(長さ)を指定します。

その他

  • funcClipWrite 関数は「マルチバイト文字セット」、「Unicode文字セット」の両方に対応しています。
  • 使用例のコンパイル時は printf 使用のため「マルチバイト文字セット」で行って下さい。
  • なお、使用例ではクリップボードに3行のテキストデータをコピーします。

関連記事



コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« クリップボードからテキスト... | トップ | クリップボードの文字列を複... »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
SetClipboardData (kam)
2021-01-13 14:04:46
SetClipboardDataでの日本語取り扱に苦慮していましたが、こちらのサイトを参考にさせて頂き、うまくいきました。
どうもありがとうございました。
返信する

コメントを投稿

便利ライブラリ関数」カテゴリの最新記事