因为Windows很笨的,它只会这样做。
先激活要截取的窗口再截取。

解决方案 »

  1.   

    好象就是这样的。
    试试SetForegroundWindow或SetActiveWindow。
      

  2.   

    不对啊, 那么画笔程序又是怎么保存画在窗口上的东西呢? 你试试看用别的窗口挡在上面, 然后保存bitmap, 一点没问题啊?! 
      

  3.   

    我GDI不太懂, 请高手赐教...
      

  4.   

    如果是像画笔那样的程序根本就无所谓,它肯定缓冲了窗口内容,保存的时候只要...
    如果你是想保存自己写的程序的窗口内容,最简单的方法就是自己创建一个内存DC和位图,如果你是用MFC,直接调用CXXXView::OnDraw即可,如果不是你也应该有自己的重画函数,将你创建的DC传进去即可.
      

  5.   

    我不用MFC, 请大虾贴点代码........
      

  6.   

    就像zqy说的那样。建立一个全局对象:
    HDC g_hMemDC = NULL;
    HBITMAP g_hBitmap = NULL;
    BOOL g_bPtInit = FALSE;
    ...
    case WM_PAINT:
    {
       PAINTSTRUCT PtData;
       HDC hdc = BeginPaint(hWnd, &PtData);
       RECT rect;
       GetClientRect(hWnd, &rect);
       //完成一些初始化工作。
       if(!g_bPtInit) {
          g_hMemDC = CreateCompatibleDC(hdc);
          g_hBitmap = CreateCompatibleBitmap(hdc,rect.right-rect.left+1,rect.bottom-rect.top+1);
          SelectObject(g_hMemDC,g_hBitmap);
          g_bPtInit = TRUE;
       }
       //把当前的位图保存在MemDC上,如果你不需要,也可以不用。
       BitBlt(g_hMemDC,0,0,rect.right-rect.left+1,rect.bottom-rect.top+1,hdc,0,0,SRCCOPY);
       //这里完成你的绘图工作,所有用hdc的地方都改用g_hMemDC。
       ...
       //绘图工作完成后把位图贴回到hdc上
       BitBlt(hdc,0,0,rect.right-rect.left+1,rect.bottom-rect.top+1,g_hMemDC,0,0,SRCCOPY);
       EndPaint(hWnd, &PtData);
    }
    break;
    //注意删除创建的GDI对象。
    case WM_DESTROY:
    {
       if(g_bPtInit) {
          DeleteDC(g_hMemDC);
          DeleteObject(g_hBitmap);
          g_bPtInit = FALSE;
       }
    }
    break;
    以上代码没具体测试过,希望对你有用。
      

  7.   

    对了,如果你要保存Window的边框和标题栏,应该还得重载WM_NCPAINT
    case WM_NCPAINT
    {
       //调用DefWindowProc绘制边框和标题栏
       DefWindowProc(hWnd,uMessage,wParam,lParam);
       //如果没有初始化,则完成初始化工作,我忘了WM_PAINT和WM_NCPAINT哪个会先调用了。为了安全...
       if(!g_bPtInit) {
          g_hMemDC = CreateCompatibleDC(hdc);
          g_hBitmap = CreateCompatibleBitmap(hdc,rect.right-rect.left+1,rect.bottom-rect.top+1);
          SelectObject(g_hMemDC,g_hBitmap);
          g_bPtInit = TRUE;
       }
       //把整个窗口的位图缓冲到g_hMemDC里
       RECT rect;
       HDC hdc = GetWindowDC(hWnd);
       GetWindowRect(&rect);
       BitBlt(g_hMemDC,0,0,rect.right-rect.left+1,rect.bottom-rect.top+1,hdc,0,0,SRCCOPY);  
    }
    break;
    注意相应修改一下WM_PAINT的处理。现在MemDC保存的是整个窗口的内容而不是以前客户区的内容,所以BitBlt时的坐标应该有所变化。
      

  8.   

    基本原理就是In355Hz(好象一条狗)说的那样.