得到了某个窗口的句柄, 怎样获取窗口的界面并保存为图像文件? 如果窗口是隐藏的, 能否获取正常显示时的图? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 但是,比如,你的是单文档单视图的工程,你在客户区显示了图像,然后窗口隐藏的话,你通过句柄应该是可以把这个客户区的内容保存为图像的吧、、、、、、纠结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有详细介绍,我就不多说了。 给你个参考代码: 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对于某些操作系统和对话框并不响应,你再深入研究下 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")); 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); } 同意上面的:我想HWND hwnd = ::FindWindow(NULL,_T("XX"));是关键,其他就没有新的了. vc6.0透明化如何实现? JS调用OCX的刷新问题 VC编译器的原因?怪问题,关于DLL的 照例子做的给按钮添加图片 编译通过 可是无法显示怎么回事? 求助:有关控制控件大小问题! 用CTreeView类怎么实现树型列表? 请高手指点_outp在WIN2000下怎么办?(VC) 请教高手 对话框"下一步"、"上一步"那种。实现方法是? 问两个vc的问题: 刚使用vc60编辑,为什么不能直接使用控件名字而要绑定一个变量 菜鸟求教关于自己写类函数
那就得到CWnd* m_wnd = FromHandle(hWnd)
然后建立CLientDC dc(m_wnd)
之后再建立本窗口(也就是要黏贴图的地方)CClientDC dc1(this)
最后调用BitBlt函数如果要存成bmp则建立兼容DC,然后还是bitblt~~~~具体函数用法查msdn即可~祝成功
但是,上帝关闭一扇门时又打开了另一扇门,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对于某些操作系统和对话框并不响应,你再深入研究下
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");
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);
}
我想HWND hwnd = ::FindWindow(NULL,_T("XX"));是关键,其他就没有新的了.