社区
GAME,图形处理/多媒体
帖子详情
程序抓图的问题
chinahuman
2008-10-15 04:32:38
得到一个程序的ProcessID和它的主窗体的HWND后,想对它进行抓图,无论它是最小化,还是被拖出屏幕外.不知道大家有啥好的方法没有?
...全文
109
12
打赏
收藏
微信扫一扫
点击复制链接
分享
下载分享明细
分享
举报
写回复
12 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
帮顶,学习
打赏
举报
回复
赞
相关推荐
易语言屏幕
抓图
程序
易语言屏幕
抓图
程序
源码系统结构:取当前热键, ======启动窗口
程序
集 || ||------__启动窗口_创建完毕 || ||------取当前热键 || ||------__启动窗口_托盘事件 || ||------_指定热键_被单击 || ||----
抓图
工具,实用小
程序
,实用顺手方便
抓图
实用小
程序
,只是分享搬运,自己用过,比较好使 有需要用到的朋友可以下载试试 截图方便,功能足够满足一般的操作
屏幕
抓图
程序
源码例程.
屏幕
抓图
程序
源码例程,
程序
结合易语言扩展界面支持库和扩展功能支持库,实现快照
抓图
,并剪切图片保存的功能。
编写
抓图
程序
本文给出了设计一个
抓图
程序
的完整过程,对一个
抓图
程序
所应拥有的最基本的三大功能即:热键激活、屏幕
抓图
及存储所抓取的图形等功能的实现作了详细的介绍。
抓图
程序
C#源代码
简单
抓图
程序
(C#源代码编写)
发帖
GAME,图形处理/多媒体
微信扫一扫
点击复制链接
分享社区
下载分享明细
1177
社区成员
1.4w+
社区内容
Delphi GAME,图形处理/多媒体
社区管理员
加入社区
帖子事件
创建了帖子
2008-10-15 04:32
社区公告
暂无公告