在VC中,用findwindow获得指向指定应用程序窗口的指针后,怎么获得其客户区的图像
在VC中,用findwindow获得指向指定应用程序窗口的指针后,如何获得其客户区的图像?
RT
另求一抓取指定程序客户区图片的源码!
------解决方案--------------------
获得窗口后,通过GetDC(hwnd)得到上下文,得到当前显示位图也就很容易了
CDC::GetCurrentBitmap
------解决方案--------------------
// 函数说明: bFull如果是真,则截取整个屏幕否则只截取活动窗口.strPath是保存图片的路径.
// 如果函数成功,则将文件保存在指定的路径,格式为PNG
BOOL CaptureScreen(BOOL bFull, CString strPath)
{
CImage image;
CWnd* pWnd;
CRect rect;
BOOL bStat;
if(bFull)
pWnd = CWnd::GetDesktopWindow();
else
pWnd = CWnd::GetActiveWindow();
ASSERT(pWnd);
if(pWnd == NULL)
return FALSE;
CWindowDC winDC(pWnd);
pWnd-> GetWindowRect(&rect);
int nBPP = winDC.GetDeviceCaps(BITSPIXEL) * winDC.GetDeviceCaps(PLANES);
if(nBPP < 24) nBPP = 24;
bStat = image.Create(rect.Width(), rect.Height(), nBPP);
ASSERT(bStat);
if(!bStat)
return FALSE;
CImageDC imageDC(image);
::BitBlt(imageDC, 0, 0, rect.Width(), rect.Height(), winDC, 0, 0, SRCCOPY);
CString strFull = MakeFilename(strPath);
HRESULT hr = image.Save(strFull);
if(FAILED(hr))
{
TRACE( "Couldn 't Save File: %s, %x\n ", (LPCTSTR)strFull, hr);
return FALSE;
}
return TRUE;
}
// 函数说明:结合路径,自动产生一个文件名
CString MakeFilename(CString& strPath)
{
CString strRet(strPath);
static UINT i=0;
if(strRet.Right(1) != "\\ ")
strRet += "\\ ";
strRet.AppendFormat( "%03.3d.png ", i++);
return strRet;
}
// 引用方法:
CaptureScreen(TRUE, "c:\\ ");
------解决方案--------------------
CWindowDC winDC(pWnd);
pWnd-> GetWindowRect(&rect);
把这两条语句改为:
CClientDC winDC(pWnd);
pWnd-> GetClinetRect(&rect);
------解决方案--------------------
CDC::GetCurrentBitmap
这个能得到图片吗 关注学习
如果不行 最笨的方法就是类似屏幕抓图了
------解决方案--------------------
#include <AtlImage.h>
------解决方案--------------------
截取屏幕就可以了
如果要是dx的话,截取屏幕就不适用了
cimage的类是个开源项目
你可以到googel上一搜索就可以找到源码
------解决方案--------------------
档住的部分没画出来,所以截不住
------解决方案--------------------
我试着做了以下,建了一个对话框的程序,用BitBlt把想抓取窗口的图象拷到自己的程序上,然后再GetPixel,取得一点的象素。
使用FindWindow,GetDC等API
RT
另求一抓取指定程序客户区图片的源码!
------解决方案--------------------
获得窗口后,通过GetDC(hwnd)得到上下文,得到当前显示位图也就很容易了
CDC::GetCurrentBitmap
------解决方案--------------------
// 函数说明: bFull如果是真,则截取整个屏幕否则只截取活动窗口.strPath是保存图片的路径.
// 如果函数成功,则将文件保存在指定的路径,格式为PNG
BOOL CaptureScreen(BOOL bFull, CString strPath)
{
CImage image;
CWnd* pWnd;
CRect rect;
BOOL bStat;
if(bFull)
pWnd = CWnd::GetDesktopWindow();
else
pWnd = CWnd::GetActiveWindow();
ASSERT(pWnd);
if(pWnd == NULL)
return FALSE;
CWindowDC winDC(pWnd);
pWnd-> GetWindowRect(&rect);
int nBPP = winDC.GetDeviceCaps(BITSPIXEL) * winDC.GetDeviceCaps(PLANES);
if(nBPP < 24) nBPP = 24;
bStat = image.Create(rect.Width(), rect.Height(), nBPP);
ASSERT(bStat);
if(!bStat)
return FALSE;
CImageDC imageDC(image);
::BitBlt(imageDC, 0, 0, rect.Width(), rect.Height(), winDC, 0, 0, SRCCOPY);
CString strFull = MakeFilename(strPath);
HRESULT hr = image.Save(strFull);
if(FAILED(hr))
{
TRACE( "Couldn 't Save File: %s, %x\n ", (LPCTSTR)strFull, hr);
return FALSE;
}
return TRUE;
}
// 函数说明:结合路径,自动产生一个文件名
CString MakeFilename(CString& strPath)
{
CString strRet(strPath);
static UINT i=0;
if(strRet.Right(1) != "\\ ")
strRet += "\\ ";
strRet.AppendFormat( "%03.3d.png ", i++);
return strRet;
}
// 引用方法:
CaptureScreen(TRUE, "c:\\ ");
------解决方案--------------------
CWindowDC winDC(pWnd);
pWnd-> GetWindowRect(&rect);
把这两条语句改为:
CClientDC winDC(pWnd);
pWnd-> GetClinetRect(&rect);
------解决方案--------------------
CDC::GetCurrentBitmap
这个能得到图片吗 关注学习
如果不行 最笨的方法就是类似屏幕抓图了
------解决方案--------------------
#include <AtlImage.h>
------解决方案--------------------
截取屏幕就可以了
如果要是dx的话,截取屏幕就不适用了
cimage的类是个开源项目
你可以到googel上一搜索就可以找到源码
------解决方案--------------------
档住的部分没画出来,所以截不住
------解决方案--------------------
我试着做了以下,建了一个对话框的程序,用BitBlt把想抓取窗口的图象拷到自己的程序上,然后再GetPixel,取得一点的象素。
使用FindWindow,GetDC等API