全画面をクリップボードにコピーする

現在画面に表示されている画像をクリップボードに取り込むと共に描画します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

クリップボードに書き出す

表示中の画面をクリップボードに書き出す手順は次のようになります。
  1. WM_CREATE: で Window のサイズを取得しておきます。
  2. トップレベルに表示中の自分自身の Window を隠します。
  3. スクリーンの hdc を取得します。
  4. 次にこの hdc と互換性のあるメモリデバイスコンテキストを作ります。
  5. さらに、hdcと互換性のあるビットマップを作成します。
  6. メモリデバイスコンテキストにこのビットマップを選択します。
  7. BitBlt で hdc をメモリデバイスコンテキストに転送します。
  8. ビットマップをクリップボードに転送します。
  9. 不要になったデバイスコンテキストを破棄します。

プログラムの説明

それでは具体的に説明して行きましょう。
WM_CREATE: で Window のサイズを取得して static 変数に格納しておきます。
    static  int wx, wy;
    {   case WM_CREATE:
             wx = GetSystemMetrics(SM_CXSCREEN);
             wy = GetSystemMetrics(SM_CYSCREEN);
             break;

IDM_GET: で現在画面に表示されている画像を取得します。
ShowWindow(hWnd, SW_HIDE); は自分自身を隠すコードです。
実行が終わるまで Sleep(500); で待機します。
    static RECT     rc;
    HDC             hdc, hdcScreen, hdc_mem, hdc_mem_screen;
    static HBITMAP  hBitmap;
    static          int wx, wy;
    PAINTSTRUCT     ps;
            :
    case IDM_GET:
         GetClientRect(hWnd, &rc);
         ShowWindow(hWnd, SW_HIDE);
         Sleep(500);
         hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
         hdc_mem_screen = CreateCompatibleDC(hdcScreen);
         hBitmap = CreateCompatibleBitmap(hdcScreen, wx, wy);
         SelectObject(hdc_mem_screen, hBitmap);
         BitBlt(hdc_mem_screen,0,0,wx,wy,hdcScreen,0,0,SRCCOPY);
         if(OpenClipboard(hWnd) != 0)
         {  EmptyClipboard();
            SetClipboardData(CF_BITMAP, hBitmap);
            CloseClipboard();
         }
         DeleteDC(hdc_mem_screen);
         DeleteDC(hdcScreen);
         ShowWindow(hWnd, SW_SHOWNORMAL);
         break;

WM_PAINT: では画像が取得されているとき描画します。
    case WM_PAINT:
         if (hBitmap)
         {  hdc = BeginPaint(hWnd, &ps);
            hdc_mem = CreateCompatibleDC(hdc);
            SelectObject(hdc_mem, hBitmap);
            BitBlt(hdc, 0, 0, wx, wy, hdc_mem, 0, 0, SRCCOPY);
            DeleteDC(hdc_mem);
            EndPaint(hWnd, &ps);
         }
         else
         {  return DefWindowProc(hWnd, msg, wp, lp);
         }
         break;

C# でも同様のプログラムを作成しています。
Clipboard Image Screen Capture を参照して下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)