Visual C++クリップボード操作

4350 ワード

記事の概要:
 
1、テキスト内容の操作
 
2、WMFデータの操作
 
3、ビットマップの操作
 
4、カスタムフォーマットの設定
 
5、クリップボードの内容の変化を感知する
 
6、データを自動的に別のアプリケーションウィンドウに貼り付ける
一、テキストの内容をクリップボードにコピーする方法:
CString source;//       source    
if(OpenClipboard()) 
{ 
     HGLOBAL clipbuffer; 
    char * buffer; 
EmptyClipboard(); 
    clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1); 
buffer       = (char*)GlobalLock(clipbuffer); 
lstrcpy(buffer, LPCSTR(source)); 
    GlobalUnlock(clipbuffer); 
    SetClipboardData(CF_TEXT,clipbuffer); 
    CloseClipboard(); 
}

次のコードは、クリップボードからテキストの内容を取得する方法を示しています.
char * buffer = NULL; 
CString fromClipboard; 
if ( OpenClipboard() )//      
{
     HANDLE hData = GetClipboardData(CF_TEXT); 
    char * buffer    = (char*)GlobalLock(hData); 
    fromClipboard      = buffer; 
GlobalUnlock(hData); 
CloseClipboard(); 
}

二、WMFデータの操作
クリップボードに画像データを読み書きするのは非常に有用な機能であり、実現も簡単です.次のコードは、拡張エンティティファイルをクリップボードにコピーする方法を示しています.
if(OpenClipboard()); 
{ 
EmptyClipboard();
//      DC 
CMetaFileDC * cDC = new CMetaFileDC(); 
cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//      
//  CMetafileDC        
HENHMETAFILE handle = cDC->CloseEnhanced();
//       
SetClipBoardData(CF_ENHMETAFILE,handle); 
CloseClipboard();
//  dc 
delete cDC; 
}

次のコードは、クリップボードからエンティティファイルを取得し、クライアントDCに描画することを示します.
if(OpenClipboard()) 
{ 
//        
HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//   
CClientDC dc(this); 
CRect client(0,0,200,200); 
dc.PlayMetaFile(handle,client);
//      
CloseClipboard(); 
} 

三、ビットマップの操作
ビットマップの操作は少し複雑ですが、次の例では、クリップボードにビットマップを保存する方法を示します.
if(OpenClipboard()) 
{ 
EmptyClipboard(); 
CBitmap * junk = new CBitmap(); 
CClientDC cdc(this); 
CDC dc; 
dc.CreateCompatibleDC(&cdc); 
CRect client(0,0,200,200); 
junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height()); 
dc.SelectObject(junk);
DrawImage(&dc,CString("Bitmap"));
//         
SetClipboardData(CF_BITMAP,junk->m_hObject); 
CloseClipboard();
delete junk; 
}

次のコードは、クリップボードからビットマップデータを取得する方法を示します.
if(OpenClipboard()) 
{ 
//        
HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP); 
CBitmap * bm = CBitmap::FromHandle(handle);
CClientDC cdc(this); 
CDC dc; 
dc.CreateCompatibleDC(&cdc); 
dc.SelectObject(bm); 
cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);
CloseClipboard(); 
}

四、カスタムフォーマットの設定と使用
RegisterClipboardFormat()関数を使用すると、必要なデータ型をコピーして貼り付けることができます.たとえば、次のデータ型があります.
struct MyFormatData 
{ 
long val1; 
int val2; 
};

クリップボードにコピーするには、次のコードを使用します.
UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT"); 
if(OpenClipboard()) 
{ 
MyFormatData data; 
data.val1 = 100; 
data.val2 = 200;
HGLOBAL clipbuffer; 
EmptyClipboard(); 
clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData)); 
MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);
//      
*buffer = data;
//       
GlobalUnlock(clipbuffer); 
SetClipboardData(format,clipbuffer); 
CloseClipboard(); 
}

データの読み込みには、次のコードが使用されます.
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT"); 
MyFormatData data; 
if(Openclipboard()) 
{ 
HANDLE hData =GetClipboardData(format); 
MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);
data = *buffer;
GlobalUnlock(hData); 
CloseClipboard(); 
}

五、クリップボードの内容の変化を感知する
Windowsメッセージを使用して、クリップボードの内容が変更されたかどうかを確認できます.コードは次のとおりです.
In your initialization code call: 
SetClipboardViewer(); //               
In your message map add: 
ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //  Message handle
Which is declared as: 
afx_msg void OnClipChange();
Finally implement: 
void CDetectClipboardChangeDlg::OnClipChange() 
{ 
    CTime time = CTime::GetCurrentTime(); 
    SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));
    DisplayClipboardText(); 
}

六、データを自動的に別のアプリケーションウィンドウに貼り付ける
該当するウィンドウのハンドルを取得し、メッセージを送信するだけです.
SendMessage(m_hTextWnd, WM_PASTE, 0, 0);