失去了某个窗口的句柄, 怎样获取窗口的界面并保存为图像文件

得到了某个窗口的句柄, 怎样获取窗口的界面并保存为图像文件?
如果窗口是隐藏的, 能否获取正常显示时的图?



------解决方案--------------------
那个图像是显示在你那个隐藏窗口的么?估计隐藏了的话,用一般的方法可能不行吧,一般的方法是把一个区域的屏幕内容保存到图像文件,如果你隐藏了,用这样的方法就不行了吧。。。。。除非你在内存中有这个图像数据。

具体没做过,期待高人解决
------解决方案--------------------
但是,比如,你的是单文档单视图的工程,你在客户区显示了图像,然后窗口隐藏的话,你通过句柄应该是可以把这个客户区的内容保存为图像的吧、、、、、、纠结ing
------解决方案--------------------
不知道楼主要获取哪张图?
------解决方案--------------------
把窗体文件输出到图象文件,重定位一下
------解决方案--------------------
vista以上用Desktop window Manager(DWM)可以。
------解决方案--------------------
窗体隐藏一般的API函数是不能绘制出图像的,除非在Windows的显示区域内

但如果你的窗体是通过内存画上去的,你可以在保存时重新绘制一次显示保存
------解决方案--------------------
得到句柄了?
那就得到CWnd* m_wnd = FromHandle(hWnd)
然后建立CLientDC dc(m_wnd)
之后再建立本窗口(也就是要黏贴图的地方)CClientDC dc1(this)
最后调用BitBlt函数

如果要存成bmp则建立兼容DC,然后还是bitblt~~~~具体函数用法查msdn即可~祝成功
------解决方案--------------------
窗体隐藏一般的API函数是不能绘制出图像的,除非在Windows的显示区域内

但如果你的窗体是通过内存画上去的,你可以在保存时重新绘制一次显示保存
------解决方案--------------------
当一个窗口被隐藏或部分被隐藏时,窗口中的不可见的部分将会被GetWindowDC返回的设备环境上下文擦除。也就是说隐藏的那一部分是不能被抓图的,如果仅仅用BitBlt等函数。
但是,上帝关闭一扇门时又打开了另一扇门,Win32 API提供了2个特殊的消息,WM_PRINT和WM_PRINTCLIENT。MSDN有详细介绍,我就不多说了。
给你个参考代码:
C/C++ code

        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();
        }

------解决方案--------------------
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");
------解决方案--------------------
同意上面的:
我想HWND hwnd = ::FindWindow(NULL,_T("XX"));是关键,其他就没有新的了.

------解决方案--------------------
PrintWindow应该可以