下の記述により、次のようなコードになると思われる。
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;
}