クリップボードを使う

ここでは、クリップボードにテキストデータをコピーしたり、 クリップボードからテキストデータを取得する方法を説明する。
クリップボードへテキストデータをコピーする
CClipboardというクラスを作成し、以下のような関数を定義する。 この関数は、引数に設定したテキストをクリップボードへコピーするというものである。
	BOOL CClipboard::SetClipboardText(LPCTSTR lpszText)
	{
		CString strText(lpszText);

		// 文字列が空の場合はコピーしない
		if( strText.IsEmpty() )
			return FALSE;

		// クリップボードのオープン
		if( !::OpenClipboard(NULL) )
			return FALSE;

		// ヒープ上にメモリ領域を確保し、文字列をコピー
		int iStrLen = strText.GetLength() + 1;
		HGLOBAL hMem = ::GlobalAlloc(GMEM_FIXED, iStrLen);
		LPTSTR pMem = (LPTSTR)hMem;
		::lstrcpy(pMem, (LPCTSTR)strText);

		// クリップボードへ文字列をコピーし、クローズ
		::EmptyClipboard();	// クリップボードの中身を空にする
		::SetClipboardData(CF_TEXT, hMem);
		::CloseClipboard();

		return TRUE;
	}
クリップボードへコピーするデータは、GlobalAlloc APIを使って確保したメモリ領域に設定する必要がある。 ここでは第1引数にGMEM_FIXEDを指定しているので、 戻り値であるハンドルhMemをキャストするだけでポインタpMemが取得できる。 第1引数にGMEM_MOVEABLEを指定した場合には、GlobalLock APIでポインタを取得する必要がある。
また、ヒープ上に確保したメモリ領域を解放(GlobalFree API)していないが、 SetClipboardData APIでクリップボードへ設定したメモリ領域は以後クリップボードが制御するため、 アプリケーションが解放する必要はない(というか解放してはいけない)。
なお、OpenClipboard APIでクリップボードをオープンすると他のアプリケーションからは使えなくなるので、 必要がなくなったらすぐにCloseClipboard APIでクローズすること。

クリップボードのテキストデータを取得する
CClipboardというクラスに以下のような関数を定義する。 この関数は、クリップボードにクリップされたテキストデータがあればそれを取得する。
	CString CClipboard::GetClipboardText()
	{
		CString strText;
		strText.Empty();

		// クリップボードにテキストデータが入っているかを調べる
		if( !::IsClipboardFormatAvailable(CF_TEXT) )
			return strText;

		// クリップボードのオープン
		if( !::OpenClipboard(NULL) )
			return strText;

		// クリップボードからデータを取得し、strTextへコピー
		HANDLE hMem = ::GetClipboardData(CF_TEXT);
		LPTSTR pMem = (LPTSTR)::GlobalLock(hMem);
		::lstrcpy((LPTSTR)(LPCTSTR)strText, pMem);
		::GlobalUnlock(hMem);
		::CloseClipboard();

		return strText;
	}

目次へ