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

验证码识别 2011-02-22 07:43:42
如果窗口是隐藏的, 能否获取正常显示时的图?

...全文
1851 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bzcyer 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fishion 的回复:]
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……
[/Quote]

窗口最小化后,不能拿到全部的图像哎。。
向立天 2011-02-25
  • 打赏
  • 举报
回复
PrintWindow应该可以
无水先生 2011-02-25
  • 打赏
  • 举报
回复
同意上面的:
我想HWND hwnd = ::FindWindow(NULL,_T("XX"));是关键,其他就没有新的了.
fishion 2011-02-25
  • 打赏
  • 举报
回复
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);
}
fishion 2011-02-25
  • 打赏
  • 举报
回复
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");
geaglem 2011-02-24
  • 打赏
  • 举报
回复
当一个窗口被隐藏或部分被隐藏时,窗口中的不可见的部分将会被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对于某些操作系统和对话框并不响应,你再深入研究下
手机写程序 2011-02-23
  • 打赏
  • 举报
回复
vista以上用Desktop window Manager(DWM)可以。
验证码识别 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jyh_baoding 的回复:]
把窗体文件输出到图象文件,重定位一下
[/Quote]
隐藏的的窗体也行?
验证码识别 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jyh_baoding 的回复:]
把窗体文件输出到图象文件,重定位一下
[/Quote]

窗体的窗体也行?
jyh_baoding 2011-02-23
  • 打赏
  • 举报
回复
把窗体文件输出到图象文件,重定位一下
tulipcaicai 2011-02-23
  • 打赏
  • 举报
回复
不知道楼主要获取哪张图?
yiruirui0507 2011-02-23
  • 打赏
  • 举报
回复
窗体隐藏一般的API函数是不能绘制出图像的,除非在Windows的显示区域内

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

如果要存成bmp则建立兼容DC,然后还是bitblt~~~~具体函数用法查msdn即可~祝成功
qiuxin425 2011-02-23
  • 打赏
  • 举报
回复
窗体隐藏一般的API函数是不能绘制出图像的,除非在Windows的显示区域内

但如果你的窗体是通过内存画上去的,你可以在保存时重新绘制一次显示保存
TandyT 2011-02-22
  • 打赏
  • 举报
回复
好像理解错了,楼主是想在窗口隐藏时,把被隐藏的窗口界面在不隐藏时的外观 保存为图像文件吧、、、、
TandyT 2011-02-22
  • 打赏
  • 举报
回复
但是,比如,你的是单文档单视图的工程,你在客户区显示了图像,然后窗口隐藏的话,你通过句柄应该是可以把这个客户区的内容保存为图像的吧、、、、、、纠结ing
TandyT 2011-02-22
  • 打赏
  • 举报
回复
那个图像是显示在你那个隐藏窗口的么?估计隐藏了的话,用一般的方法可能不行吧,一般的方法是把一个区域的屏幕内容保存到图像文件,如果你隐藏了,用这样的方法就不行了吧。。。。。除非你在内存中有这个图像数据。

具体没做过,期待高人解决

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧