[BACK]Return to clipboard.txt CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / windows / winfep

File: [local] / OpenXM_contrib2 / windows / winfep / clipboard.txt (download)

Revision 1.1, Wed Aug 7 02:28:22 2013 UTC (10 years, 9 months ago) by noro
Branch: MAIN
CVS Tags: RELEASE_1_3_1_13b, HEAD

Added clipboard.txt which describes how to copy a text string to the clipboard.

下の記述により、次のようなコードになると思われる。
str に送りたい文字列が入っているとする。

int len=strlen(str)+1;
if (!OpenClipboard(NULL) ) return;
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED,len);
LPTSTR pMem = (LPTSTR)hMem;
lstrcpy(pMem,(LPCTSTR)str);
EmptyClipboard();
SetClipboardData(CF_TEXT,hMem);
CloseClipboard();
SendMessage(asirhwnd,WM_CHAR,0x19,1); // 0x19=CTRL(Y) -> asirgui で Paste 
SendMessage(asirhwnd,WM_CHAR,'\n',1);

---------------------------------------

ここでは、クリップボードにテキストデータをコピーしたり、 クリップボードからテキストデータを取得する方法を説明する。

クリップボードへテキストデータをコピーする
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;
    	}