COLORREF color;
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// デスクトップを取る
CWnd* pwndDeskTop = GetDesktopWindow();
CDC* pDeskTopDC = pwndDeskTop->GetDC();
// 自分の領域にデスクトップからコピー
dc.BitBlt( 0,0, 200, 200, pDeskTopDC, 0, 0, SRCCOPY );
pwndDeskTop->ReleaseDC(pDeskTopDC);

これでデスクトップの画像を取得し,表示。
この後に、

for(j=0;j<yh;j++)
for(i=0;i<xw;i++){
color=pDC->GetPixel(x0+i,y0+j);
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
c=(r+g+b)/3;
pDC->SetPixel(x1+i,y0+j,RGB(c,c,c));
}
のような操作で白黒化を試したのですが、
1度ワークスペースに描写してからGetPixelでは
無駄な処理(ワークスペース内に描写)があって効率が悪い気がします。

デスクトップ上から直接RGB値をとりこみ、メモリ上で処理(この場合は白黒化)、
その後にワークスペース内に描写させるにはどうすれば良いのでしょうか?
質問ばかりですいません。