クリップボードからテキストを取得します。 IsClipboardFormatAvailable()関数で、データが存在するかを問い合わせて、 GetClipboardData()関数で取得します。サンプルプログラムでは、表示され たウインドウを左クリックする毎に、クリップボードの内容を取得して、 ウインドウに描画します。
#include <stdio.h> #include <tchar.h> #include <locale.h> #include <windows.h> #include <wingdi.h> /* ビットマップのコピー */ HBITMAP CopyBitmap ( HBITMAP hSrcBitmap ) { BITMAP tBitmap; // ビットマップ情報の取得 ::GetObject( hSrcBitmap , sizeof( tBitmap ) , &tBitmap ); HDC hDC = ::GetDC( NULL ); // ビットマップの生成 HBITMAP hDstBitmap = ::CreateCompatibleBitmap( hDC, tBitmap.bmWidth, tBitmap.bmHeight ); // メモリデバイスコンテキストの取得 HDC hSrcDC = ::CreateCompatibleDC( hDC ); HDC hDstDC = ::CreateCompatibleDC( hDC ); // 画像の選択 ::SelectObject( hSrcDC, hSrcBitmap ); ::SelectObject( hDstDC, hDstBitmap ); // 画像のコピー ::BitBlt( hDstDC, 0, 0, tBitmap.bmWidth, tBitmap.bmHeight, hSrcDC, 0, 0, SRCCOPY ); // hDCの破棄 ::DeleteDC( hSrcDC ); ::DeleteDC( hDstDC ); // hDCの解放 ::ReleaseDC( NULL, hDC ); // コピーを返す return( hDstBitmap ); } /* メインウインドウイベント処理 */ LRESULT CALLBACK eMainWindowProc( HWND hwnd // handle to window , UINT uMsg // message identifier , WPARAM wParam // first message parameter , LPARAM lParam // second message parameter ); HBITMAP g_hBitmap = NULL; int _tmain ( int argc , _TCHAR* argv[] ) { // 標準出力にユニコードを表示できるようにする setlocale( LC_ALL, "Japanese" ); WNDCLASSEX tWndClass; HINSTANCE hInstance; TCHAR* cpClassName; TCHAR* cpWindowName; TCHAR* cpMenu; HWND hWnd; MSG tMsg; // アプリケーションインスタンス hInstance = ::GetModuleHandle( NULL ); // クラス名称 cpClassName = _T("MainWindowClass"); // メニュー cpMenu = MAKEINTRESOURCE( NULL ); // ウインドウ名称 cpWindowName = _T("クリップボードからビットマップを取得する"); // ウインドウクラスパラメータセット tWndClass.cbSize = sizeof( WNDCLASSEX ); tWndClass.style = CS_HREDRAW | CS_VREDRAW; tWndClass.lpfnWndProc = eMainWindowProc; tWndClass.cbClsExtra = 0; // ::GetClassLong で取得可能なメモリ tWndClass.cbWndExtra = 0; // ::GetWindowLong で取得可能なメモリ tWndClass.hInstance = hInstance; tWndClass.hIcon = ::LoadIcon( NULL, IDI_APPLICATION ); tWndClass.hCursor = ::LoadCursor( NULL, IDC_ARROW ); tWndClass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); tWndClass.lpszMenuName = cpMenu; tWndClass.lpszClassName = cpClassName; tWndClass.hIconSm = NULL; // ウインドウクラス生成 if ( 0 == ::RegisterClassEx( &tWndClass ) ) { /* 失敗 */ return( -1 ); } // ウインドウを生成する hWnd = ::CreateWindowEx ( 0 // extended window style , tWndClass.lpszClassName // pointer to registered class name , cpWindowName // pointer to window name , WS_OVERLAPPEDWINDOW // window style , CW_USEDEFAULT // horizontal position of window , CW_USEDEFAULT // vertical position of window , 640 // window width , 480 // window height , NULL // handle to parent or owner window , NULL // handle to menu, or child-window identifier , hInstance // handle to application instance , (VOID*)0x12345678 // pointer to window-creation data ); /* メッセージループ */ while( 0 != ::GetMessage( &tMsg, NULL, 0, 0 ) ) { ::TranslateMessage ( &tMsg ); ::DispatchMessage ( &tMsg ); } // WM_QUITの終了コードを返却する return( tMsg.wParam ); } /* メインウインドウイベント処理 */ LRESULT CALLBACK eMainWindowProc ( HWND hWnd // handle to window , UINT uMsg // message identifier , WPARAM wParam // first message parameter , LPARAM lParam // second message parameter ) { switch( uMsg ) { case WM_CREATE: //-------------------------------------------- // WM_CREATE //-------------------------------------------- { CREATESTRUCT* tpCreateSt = (CREATESTRUCT*)lParam; // ウインドウを表示する ::ShowWindow( hWnd, SW_SHOW ); } break; case WM_DESTROY: //-------------------------------------------- // WM_DESTROY //-------------------------------------------- { if ( NULL != g_hBitmap ) { ::DeleteObject( g_hBitmap ); } // 終了する( 引数はそのまま終了コードとなります ) ::PostQuitMessage( 0 ); } break; case WM_LBUTTONDOWN: //-------------------------------------------- // WM_LBUTTONDOWN //-------------------------------------------- { // 指定した形式のデータがあるかを問い合わせる BOOL bRet = ::IsClipboardFormatAvailable( CF_BITMAP ); if ( 0 == bRet ) { wprintf( L"データがありません" ); break; } // クリップボードのオープン bRet = ::OpenClipboard( hWnd ); if ( 0 == bRet ) { wprintf( L"クリップボードのオープン失敗" ); break; } // クリップボードデータの取得 HBITMAP hBitmap = (HBITMAP)::GetClipboardData( CF_BITMAP ); if ( NULL != hBitmap ) { // コピー済みのデータがあれば破棄 if ( NULL != g_hBitmap ) { ::DeleteObject( g_hBitmap ); g_hBitmap = NULL; } // ビットマップのコピー g_hBitmap = ::CopyBitmap( hBitmap ); // 再描画 ::InvalidateRect( hWnd, NULL, TRUE ); } // クリップボードのクローズ ::CloseClipboard(); } break; case WM_PAINT: //-------------------------------------------- // WM_PAINT //-------------------------------------------- { PAINTSTRUCT tPaintStruct; // 描画開始 HDC hDC = ::BeginPaint( hWnd, &tPaintStruct ); if ( NULL != g_hBitmap ) { RECT tClientRect; // クライアント矩形の取得 ::GetClientRect( hWnd, &tClientRect ); BITMAP tBitmap; // ビットマップ情報の取得 ::GetObject( g_hBitmap , sizeof( tBitmap ) , &tBitmap ); // メモリデバイスコンテキストの取得 HDC hSrcDC = ::CreateCompatibleDC( hDC ); // ビットマップの選択 ::SelectObject( hSrcDC, g_hBitmap ); // ビットマップの描画 ::StretchBlt( hDC , 0 , 0 , tClientRect.right , tClientRect.bottom , hSrcDC , 0 , 0 , tBitmap.bmWidth , tBitmap.bmHeight , SRCCOPY ); // hDCの破棄 ::DeleteDC( hSrcDC ); } // 描画終了 ::EndPaint( hWnd, &tPaintStruct ); } return( FALSE ); } // デフォルト処理呼び出し return ::DefWindowProc( hWnd, uMsg, wParam, lParam ); }