如果窗口是隐藏的, 能否获取正常显示时的图?

解决方案 »

  1.   

    但是,比如,你的是单文档单视图的工程,你在客户区显示了图像,然后窗口隐藏的话,你通过句柄应该是可以把这个客户区的内容保存为图像的吧、、、、、、纠结ing
      

  2.   

    vista以上用Desktop window Manager(DWM)可以。
      

  3.   

    窗体隐藏一般的API函数是不能绘制出图像的,除非在Windows的显示区域内但如果你的窗体是通过内存画上去的,你可以在保存时重新绘制一次显示保存
      

  4.   

    得到句柄了?
    那就得到CWnd* m_wnd = FromHandle(hWnd)
    然后建立CLientDC dc(m_wnd)
    之后再建立本窗口(也就是要黏贴图的地方)CClientDC dc1(this)
    最后调用BitBlt函数如果要存成bmp则建立兼容DC,然后还是bitblt~~~~具体函数用法查msdn即可~祝成功
      

  5.   

    窗体隐藏一般的API函数是不能绘制出图像的,除非在Windows的显示区域内但如果你的窗体是通过内存画上去的,你可以在保存时重新绘制一次显示保存
      

  6.   

       当一个窗口被隐藏或部分被隐藏时,窗口中的不可见的部分将会被GetWindowDC返回的设备环境上下文擦除。也就是说隐藏的那一部分是不能被抓图的,如果仅仅用BitBlt等函数。
       但是,上帝关闭一扇门时又打开了另一扇门,Win32 API提供了2个特殊的消息,WM_PRINT和WM_PRINTCLIENT。MSDN有详细介绍,我就不多说了。
       给你个参考代码:
         
            HWND hWnd=::FindWindow(NULL,"类或名字");
             if(hWnd!=NULL)
            {
                HDC hDCMem = CreateCompatibleDC(NULL);
                RECT rect;
        GetWindowRect(hWnd, & rect);
        HBITMAP hBmp = NULL;
        {
                  HDC hDC = GetDC(hWnd);
          hBmp = CreateCompatibleBitmap(hDC, rect.right-rect.left, rect.bottom- rect.top);
                  ReleaseDC(hWnd, hDC);
                }
                HGDIOBJ hOld = SelectObject(hDCMem, hBmp);
                SendMessage(hWnd,WM_PRINT,(WPARAM) hDCMem, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);  //发送WM_PRINT消息
                  SelectObject(hDCMem,hOld);
        DeleteObject(hDCMem);       
        OpenClipboard(hWnd);          //位图信息粘贴进剪切板
         EmptyClipboard(); 
        SetClipboardData(CF_BITMAP, hBmp); 
        CloseClipboard();
            }
         
          值得一提的是WM_PRINT对于某些操作系统和对话框并不响应,你再深入研究下
      

  7.   

    HWND hwnd = ::FindWindow(NULL,_T("XXX"));
    if(hwnd == NULL)
    return;
    CDC *pDC = CDC::FromHandle(::GetDC(hwnd));
    CDC memDC;
    memDC.CreateCompatibleDC(pDC) ;  
    CRect rt;
    ::GetWindowRect(hwnd,&rt);
    CBitmap Bmp;
    Bmp.CreateCompatibleBitmap(pDC,rt.Width(), rt.Height()) ;  
    CBitmap *pBmpPrev = (CBitmap*)memDC.SelectObject(&Bmp) ;
    memDC.BitBlt(0, 0, rt.Width(), rt.Height(), pDC, 0, 0, SRCCOPY);   
    CImage image;  
    image.Attach((HBITMAP)Bmp.m_hObject);
    image.Save(L"c:\\1.bmp");
      

  8.   

    HWND hwnd = ::FindWindow(NULL,_T("XX"));
    if(hwnd == NULL)
    return;
    HDC hdc = ::GetWindowDC(hwnd);
        if (hdc)
        {
    HDC hdcMem = ::CreateCompatibleDC(hdc);
            if (hdcMem)
            {
                RECT rc;
    ::GetWindowRect(hwnd, &rc); HBITMAP hbitmap = ::CreateCompatibleBitmap(hdc,rc.right-rc.left, rc.bottom-rc.top);
                if (hbitmap)
                {
    ::SelectObject(hdcMem, hbitmap);
    ::PrintWindow(hwnd, hdcMem, 0);
    CImage image;  
    image.Attach((HBITMAP)hbitmap);
    image.Save(L"c:\\1.bmp");
    ::DeleteObject(hbitmap);
                }
    ::DeleteObject(hdcMem);
            }
    ::ReleaseDC(hwnd, hdc);
        }
      

  9.   

    同意上面的:
    我想HWND hwnd = ::FindWindow(NULL,_T("XX"));是关键,其他就没有新的了.