程序抓图的问题

chinahuman 2008-10-15 04:32:38
得到一个程序的ProcessID和它的主窗体的HWND后,想对它进行抓图,无论它是最小化,还是被拖出屏幕外.不知道大家有啥好的方法没有?
...全文
165 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
帮顶,学习

1,185

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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