社区
GAME,图形处理/多媒体
帖子详情
程序抓图的问题
chinahuman
2008-10-15 04:32:38
得到一个程序的ProcessID和它的主窗体的HWND后,想对它进行抓图,无论它是最小化,还是被拖出屏幕外.不知道大家有啥好的方法没有?
...全文
245
12
打赏
收藏
程序抓图的问题
得到一个程序的ProcessID和它的主窗体的HWND后,想对它进行抓图,无论它是最小化,还是被拖出屏幕外.不知道大家有啥好的方法没有?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chinahuman
2008-10-19
打赏
举报
回复
我自己找到答案了,用printwindow这个API轻松搞定
mdejtod
2008-10-17
打赏
举报
回复
学习
lake_cx
2008-10-17
打赏
举报
回复
楼上,那屏幕会闪吧
MyCrooner
2008-10-17
打赏
举报
回复
窗口被遮住或部分出界,可以这样,记录窗口的当前位置,然后移到屏幕中间,发送到最前面显示,接着截屏。然后复原原来的位置。
chinahuman
2008-10-16
打赏
举报
回复
"但如果它是最小化,或是被拖出屏幕外,或者被其它窗口档住了,这个实现其实可能比较困难,目前我还没有解决。以前也有人提过这个问题,但一直没有被解决。"我碰到的问题也正是这样的.我把它放到虚拟桌面上去,结果这个虚拟桌如果激活,就能抓,如果不激活就抓不到.感觉是系统这样处理了,如果它不在可视区域里面,就不再去重绘它(节省GPU?).
无条件为你
2008-10-16
打赏
举报
回复
有主窗体的HWND,就可以对其抓图,这个很容易实现:
在窗体上放一个Image和Button控件,代码:
procedure ScreenShot(hWindow: HWND; bm: TBitmap);
var
Left, Top, Width, Height: Word;
R: TRect;
dc: HDC;
lpPal: PLOGPALETTE;
begin
if not IsWindow(hWindow) then Exit;
GetWindowRect(hWindow, R);
Left := R.Left;
Top := R.Top;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
bm.Width := Width;
bm.Height := Height;
dc := GetDc(0);
if dc=0 then Exit;
if (GetDeviceCaps(dc, RASTERCAPS) and
RC_PALETTE = RC_PALETTE) then begin
GetMem(lpPal, SizeOf(TLOGPALETTE) +(255 * SizeOf(TPALETTEENTRY)));
FillChar(lpPal^,SizeOf(TLOGPALETTE) +(255 * SizeOf(TPALETTEENTRY)),#0);
lpPal^.palVersion := $300;
lpPal^.palNumEntries := GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
if (lpPal^.PalNumEntries <> 0) then begin
bm.Palette := CreatePalette(lpPal^);
end;
FreeMem(lpPal, SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)));
end;
BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,Left,Top,SRCCOPY);
ReleaseDc(0, dc);
end;
procedure TForm1.Button1Click(Sender: TObject);
var b: TBitMap;
begin
b := TBitmap.Create;
ScreenShot(FindWindow(0,'计算器'), b);
Image1.Picture.Bitmap := b;
b.Free;
end;
但如果它是最小化,或是被拖出屏幕外,或者被其它窗口档住了,这个实现其实可能比较困难,目前我还没有解决。以前也有人提过这个问题,但一直没有被解决。
chinahuman
2008-10-16
打赏
举报
回复
比比较郁闷的问题,经过研究,只要这个程序不显示或是在显示区域外,它就不会重绘,也就没有办法通过DC来抓图,不知道还有没有其它的办法呢?比如说不让它绘到DC上给是绘到我指定的位置上?
hangzhou_hammer
2008-10-16
打赏
举报
回复
行不通的吧,有些窗体又不是时时的重绘,它如果只在屏幕范围内重绘的话;你这样是怎么也抓不到的吧
JPEXE
2008-10-15
打赏
举报
回复
Mark.
xxaabb
2008-10-15
打赏
举报
回复
只会拷贝屏幕
lake_cx
2008-10-15
打赏
举报
回复
我试过,没什么好办法
我尝试过Hook它的BeginPaint和EndPaint,但是没法让目标窗体在最小化或者屏幕之外重绘。
即使我拿窗体的WndProc直接调用,给他传WM_PAIT的消息也没用。
gjw310
2008-10-15
打赏
举报
回复
帮顶,学习
图漾3d相机开发实践(1)——实时采图
本文分享图漾3D相机实时采图的开发实践。介绍了开发环境,包括下载SDK,用cmake_gui生成VS
程序
时遇到的
问题
及解决办法。还讲述了获取设备信息的步骤,以及实时
抓图
的主要流程,如开启
抓图
、
抓图
处理和关闭
抓图
等,最后总结开发要点。
Java:实现屏幕
抓图
程序
(附带源码)
该博客围绕 Java 屏幕
抓图
程序
展开,介绍项目背景与需求,涵盖全屏、区域、定时截图等功能及跨平台兼容等非功能需求。阐述相关技术,如 Java AWT Robot 截屏、图像处理保存等。给出实现思路、完整代码及解读,总结项目能力,还解答常见
问题
并提及扩展方向与性能优化。
今天用curl在网站上
抓图
,出现请求超时,还有就是访问汉字和带空格的url的注意事项
本文介绍了如何解决PHP中
抓图
时出现的超时
问题
,通过设置`set_time_limit()`函数限制执行时间,并提供了访问包含汉字和特殊字符URL的解决方案。包括设置字体为GBK、URL转义等操作,确保了
程序
稳定运行。
最近工作中遇到的堆栈溢出的
问题
文章讲述了在使用Onvif协议
抓图
时遇到的栈溢出
问题
,由于图片质量高占用大量内存导致。
问题
源于局部大数组导致的栈内存超出默认限制。解决方案包括增大栈内存限制和改用堆内存。建议尽量避免使用过大数组,优化
程序
结构。
basler相机使用try..catch捕获异常,导致
程序
终止
在两个不同的函数中,尝试启动相机
抓图
时,使用了不同的策略。当使用GrabStrategy_OneByOne并拔掉网线时,
程序
会崩溃。然而,改为使用GrabStrategy_LatestImageOnly后,
问题
得到解决。这表明在没有网络连接的情况下,GrabStrategy_OneByOne策略可能导致异常未被正确处理。
GAME,图形处理/多媒体
1,184
社区成员
14,330
社区内容
发帖
与我相关
我的任务
GAME,图形处理/多媒体
Delphi GAME,图形处理/多媒体
复制链接
扫一扫
分享
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章