怎样编程才能象HyperSnap那样截取扩展活动窗口的图像??
各位高手:
象HyperSnap那样的抓图软件能设置要截取的窗口的宽和高的像素大小(可以大于屏幕的像素大小),并能截取该窗口完整的图像,怎样编程???
问题点数:100、回复次数:15Top
1 楼zwh202342(little grass)回复于 2006-07-24 08:39:08 得分 0
http://www.ccrun.com的网站里有关于截屏并传送的一个例子,你可以去看看!Top
2 楼maomi123123123(猫咪)回复于 2006-07-24 11:49:23 得分 0
我说的是, 象HyperSnap那样的抓图软件能设置要截取的窗口的宽和高的像素大小(可以大于屏幕的像素大小),并能截取该窗口完整的图像,怎样编程实现啊???
另, 像snapit那样的抓图软件能进行DOS截屏, 又怎样编程实现呢???
Top
3 楼sfengnet(☆☆☆☆☆)回复于 2006-07-26 00:14:32 得分 0
// 捕获当前屏幕并保存到imagestream中 楼主看一下吧,对你很有用
void CaptureImage(int options, int level, int cq, TMemoryStream* imgstream)
{
LONG width,height;
RECT capRect;
HDC DesktopDC;
switch (options) {
case CM_ENTIRESCREEN: // 捕获整个屏幕
// 取得桌面的矩形区域范围
GetWindowRect(GetDesktopWindow(),&capRect);
break;
case CM_ACTIVEWINDOW: // 捕获当前窗口
HWND ForegWin;
ForegWin = GetForegroundWindow(); // 取得当前窗口句柄
if (!ForegWin)
ForegWin = GetDesktopWindow();
GetWindowRect(ForegWin,&capRect); // 取得当前窗口的矩形区域范围
break;
}
DesktopDC = GetDC(GetDesktopWindow()); // 创建内存设备描述表
width = capRect.right - capRect.left;
height = capRect.bottom - capRect.top;
Graphics::TBitmap *bBitmap; // 定义位图变量
try {
bBitmap = new Graphics::TBitmap(); // 创建位图
bBitmap->Width=width;
bBitmap->Height=height;
if ((level>0)&&(level<8))
bBitmap->PixelFormat = TPixelFormat(level); // 设定色深
// 拷贝屏幕的指定区域到位图
BitBlt(bBitmap->Canvas->Handle,0,0,width,height,DesktopDC,
capRect.left,capRect.top,SRCCOPY);
if (cq>=0) {
TJPEGImage *jpeg;
try {
jpeg = new TJPEGImage; // 创建JPEG图象
jpeg->CompressionQuality = cq; // 设定图象品质
jpeg->Assign(bBitmap); // 将位图转化为JPEG格式
jpeg->SaveToStream(imgstream); // 保存JPEG图象信息
}
__finally {
delete jpeg; // 释放资源
}
}
else {
bBitmap->SaveToStream(imgstream); // 保存位图信息
}
}
__finally {
delete bBitmap; // 释放资源
}
}Top
4 楼maomi123123123(猫咪)回复于 2006-07-26 08:01:53 得分 0
你没有回答我的问题啊!
我说的是, 象HyperSnap那样的抓图软件截图方式很多, 其中包括扩展活动窗口截图 和 滚屏截图, 用扩展活动窗口方式截图时, 能设置要截取的活动窗口的宽和高的像素大小(可以大于屏幕的像素大小),并能截取该窗口完整的图像,怎样编程实现啊???
另, 像snapit那样的抓图软件能进行DOS截屏, 又怎样编程实现呢???我想大概分以下两种情况来分析
1. 在Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95上运行的DOS窗口时, 如何获取DOS窗口的句柄, 因为
一旦获取窗口的句柄, 就能轻松编程截取该窗口的图像. 在Windows XP及其后的Windows平台, 有GetConsoleWindow函数获取窗口的句柄, 而Windows 98, Windows 95却没有, 怎样才能在上述所有平台上获取DOS窗口的句柄呢?? 在全屏DOS窗口下, 情况是否相同呢??
2. 在纯DOS环境下, 怎样做到按一下某个按键, 自动在后台启动指定的程序并能截取当前DOS屏幕的图像??(如果指定的程序已经启动, 则截取当前DOS屏幕的图像), 再按一下另一个键, 则退出
指定的程序, 上述如何编程实现啊???
你大概没有用过HyperSnap吧, 先搜索下载一个用用就知道了. 扩展活动窗口截图与滚屏截图不同, 你先搜索下载一个用用就知道了.Top
5 楼maomi123123123(猫咪)回复于 2006-08-02 14:16:02 得分 0
各位高手:
象HyperSnap,snagit那样的抓图软件截图方式很多, 其中包括扩展活动窗口截图 和 滚屏截图, 用扩展活动窗口方式截图时, 能设置要截取的活动窗口的宽和高的像素大小(可以大于屏幕的像素大小),并能截取该窗口完整的图像,也就是说能截取窗口在桌面以外的部分, 怎样编程实现呢? 我用了一下snagit, 发现截屏时窗口尺寸向右或下扩展一下并恢复原状, 窗口并无移动. 扩展一下当前窗口可以用windowsAPI实现的, 但如何截取窗口在桌面以外部分的图像呢? (我发现截屏时窗口尺寸向右或下扩展一下并恢复原状, 窗口并无移动)
谁能提供思路呢? 介绍相关贴子或资料也可以. 我在网上搜索了多天一无所获!!!
另, 像snapit那样的抓图软件能进行DOS截屏, 又怎样编程实现呢??? 在纯DOS环境下, 怎样做到按一下某个按键, 自动在后台启动指定的程序并能截取当前DOS屏幕的图像??(如果指定的程序已经启动, 则截取当前DOS屏幕的图像), 再按一下另一个键, 则退出指定的程序, 上述如何编程实现啊???
Top
6 楼cczlp(不惑)回复于 2006-08-02 14:52:42 得分 0
想办法把那个程序的界面画到指定DC上. 不能用GetDesktopWindow.Top
7 楼daydayup234(关中刀客)回复于 2006-08-11 16:07:29 得分 0
你是不是只要截“活动”窗体的“完整”大小
不要整个桌面
如果只要这个单一功能,可以考虑。
我没有用过HyperSnap 。Top
8 楼constantine(飘遥的安吉儿)回复于 2006-08-11 16:22:39 得分 0
我到是明白lz的意思,他要的应该是活动窗体有部分不在屏幕中,想截图截完整
不知道参考paintto的做法行不行我没有试过,你可以看看PaintTo函数做了什么东西
DOS的不懂我几乎没有用过,只在装系统或者备份之类时用过DOS,说不上,不知道做一个控制台程序实现类似的功能是否可以行,一般截图都设计到DC,DOS是否也有,实在不了解DOSTop
9 楼unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回复))回复于 2006-08-11 20:44:15 得分 0
据说是不是可以将部分函数重定向,然后再发消息给该窗口进行重绘?Top
10 楼maomi123123123(猫咪)回复于 2006-08-18 06:50:36 得分 0
我已经找到线索, HyperSnap截取扩展活动窗口截图只能在windows xp上进行,不能在
98,95上进行, 这可能与窗口的离屏缓冲(offscreen buffer)有关.windows xp 有窗口的offscreen buffer,而98,95没有, 不过我还没有弄懂.请大家一起研究.
Top
11 楼hsn1982(常年收购破铜烂铁)回复于 2006-09-08 14:57:04 得分 0
顶Top
12 楼helenhf(rtos.bigwww.com)回复于 2007-02-06 09:42:25 得分 0
楼主有解决办法了吗?关注一下下~~Top
13 楼yangairong1984()回复于 2007-03-22 11:12:56 得分 0
关注,你可以搜索一下,有关于你所说的那些方法的截屏Top
14 楼constantine(飘遥的安吉儿)回复于 2007-03-22 12:08:19 得分 0
汗,这么久的帖子也没结
其实用printwindow这个api就可以做到
估计又是一个等强行揭帖的主Top
15 楼zzd8310(东北笑笑生)(经常被模仿,从未被超越!||我之所以把昵称写这么长。就是想看看昵称到底能写多长,真是长)回复于 2007-03-22 20:36:03 得分 0
一楼好快Top




