窗口取图问题

验证码识别 2011-02-24 11:25:23

CWnd myWnd;
HWND hWnd = ::FindWindow("GxWindowClass", tittle); //窗口w的标题
myWnd.Attach(hWnd);

CRect rect;
myWnd.GetClientRect(&rect);

CDC memCDC;
memCDC.CreateCompatibleDC(myWnd.GetDC());
myWnd.PrintWindow(&memCDC, PW_CLIENTONLY);

HBITMAP hbmp = CreateCompatibleBitmap(memCDC.GetSafeHdc(), rect.right - rect.left, rect.bottom - rect.top);


CImage image;
image.Attach(hbmp);
image.Save("1.bmp" );

image.Detach();



以上代码为什么取的图是黑的?(非隐藏,遮挡窗口)

怎么取个图这么复杂?



...全文
110 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yzm888 的回复:]
请教下, 使用 PrintWindow 函数的话怎么做?

因为看到了个方法,加消息钩子使用PrintWindow 可以把隐藏,遮挡的图也取出来
[/Quote]使用PrintWindow只要保证句柄正确即可
无水先生 2011-02-25
  • 打赏
  • 举报
回复
myWnd.Attach(hWnd);
这句有误.
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);
}
Eleven 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yzm888 的回复:]
请教下, 使用 PrintWindow 函数的话怎么做?

因为看到了个方法,加消息钩子使用PrintWindow 可以把隐藏,遮挡的图也取出来
[/Quote]
VC6不支持,你可用VS2005,2008,另外注意
Windows NT/2000/XP/Vista: Included in Windows XP and Windows Server 2003.
Windows 95/98/Me: Unsupported.
tla_shell Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.
Eleven 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yzm888 的回复:]
请教下, 使用 PrintWindow 函数的话怎么做?

因为看到了个方法,加消息钩子使用PrintWindow 可以把隐藏,遮挡的图也取出来
[/Quote]
void CaptureWindow(HWND hWnd)
{
HDC hDC = ::GetWindowDC(hWnd);
ASSERT(hDC);

HDC hdcMem = ::CreateCompatibleDC(hDC);
ASSERT(hdcMem);

RECT rc;
::GetWindowRect(hWnd, &rc);

HBITMAP hbitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
ASSERT(hbitmap);

HBITMAP hOldBmp = (HBITMAP)::SelectObject(hdcMem, hbitmap);
::PrintWindow(hWnd, hdcMem, 0);

::OpenClipboard(NULL);
::EmptyClipboard();
::SetClipboardData(CF_BITMAP, hbitmap);
::CloseClipboard();

::SelectObject(hdcMem, hOldBmp);
::DeleteObject(hbitmap);
::DeleteObject(hdcMem);
::ReleaseDC(hWnd, hDC);
}
smwhotjay 2011-02-25
  • 打赏
  • 举报
回复
位图未被选择到memdc... - -! orz orz orz orz
验证码识别 2011-02-25
  • 打赏
  • 举报
回复
PrintWindow 有什么限制?

为什么除了标题栏, 边框, 其他区域是黑的?
验证码识别 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 visualeleven 的回复:]
http://blog.csdn.net/VisualEleven/archive/2011/02/25/6206715.aspx
[/Quote]

客户区域是黑的
验证码识别 2011-02-24
  • 打赏
  • 举报
回复

请教下, 使用 PrintWindow 函数的话怎么做?

因为看到了个方法,加消息钩子使用PrintWindow 可以把隐藏,遮挡的图也取出来

fishion 2011-02-24
  • 打赏
  • 举报
回复
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");

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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