求助 delphi截图问题
delphi吧
全部回复
仅看楼主
level 5
随云home 楼主
在网上逛了好久,找到一部分截图的代码,但不是我想要的效果,要么就是全屏截图,要么就是不能覆盖,能覆盖的当窗体最小化时就是黑黑一片。
我想要的效果是截取一个指定的控件handle上的图片,就是是有窗体覆盖还是最小化都能截到。有没有大神做过啊,求
2015年12月26日 08点12分 1
level 5
随云home 楼主
function PrintWindow(SourceWindow: hwnd; Destination: hdc; nFlags: cardinal): boolean; stdcall; external 'user32.dll' name 'PrintWindow'; // 声明, 这是我在网上找的,看见的大神别说我抄袭,我拿来用用
procedure TRecgForm.Button1Click(Sender: TObject);
var
bmp: TBitmap;
wnd: cardinal;
rec: TRect;
begin
wnd := FindWindow(nil, '计算器'); // 计算器缩小后不能截取窗体
// wnd := Animate1.Handle; // 当我把handle指定为当前窗体上的控件时,是没有效果的
GetWindowRect(wnd, rec);
bmp := TBitmap.Create;
bmp.Width := rec.Right-rec.Left;
bmp.Height := rec.Bottom - rec.Top;
bmp.PixelFormat := pf32bit;
PrintWindow(wnd, bmp.Canvas.Handle, 0);
bmp.SaveToFile('aaa.bmp');
bmp.Free;
end;
比如说这个的效果,只能截取windows上运行的窗体,当前窗体不行,还有就是不停的截屏时会闪屏。
2015年12月26日 09点12分 2
level 5
随云home 楼主
再比如说这种:
procedure TRecgForm.GetActiveWndImg(hand: THandle); // 获取指定handle的image ,但Visible为False和窗体最小化不行
var
C: TCanvas;
b: TBitmap;
h: HDC;
r: TRect;
p: TPoint;
J: TJpegImage;
m, n: Integer;
name: array [0 .. 255] of char;
begin
b := TBitmap.Create;
C := TCanvas.Create;
//GetCurSorPos(p); // 取得鼠标所在区域坐标
//hand := WindowFromPoint(p); // 取得坐标所在窗体句柄
FillChar(name, Sizeof(name), #0); //
GetWindowText(hand, name, 255); // 取得窗口标题
if name = '' then
CopyMemory(@name, PCHAR(inttostr(hand)), Length(inttostr(hand)) + 1); // 用句柄
if hand = 0 then Exit;
h := GetWindowDC(hand); // 获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景 返回值 Long
GetWindowRect(hand, r); // 取得句柄对应窗体的矩形区域
b.Width := r.Right - r.Left;
b.Height := r.Bottom - r.Top;
C.Handle := h; // 将描述表赋给画布的句柄,此时画布就代表整个屏幕了
b.Canvas.CopyRect(Rect(0, 0, b.Width, b.Height), C, Rect(0, 0, b.Width, b.Height));
Image1.Picture.Bitmap.Assign(B);
C.Free;
b.Free;
ReleaseDC(hand, h); // 释放设备上下文环境
end;
procedure TRecgForm.BitBtn2Click(Sender: TObject)
begin
GetActiveWndImg(animate1.Handle);
end;
当窗体最小化时,截取不到,但当有东西挡到时还是可以的
2015年12月26日 09点12分 3
level 5
随云home 楼主
1111
2015年12月26日 09点12分 5
level 10
基本上,最小化是没戏的,如果是被别的窗口遮挡倒是可以用Printwindow
2015年12月27日 07点12分 6
没戏了呀[啊]
2015年12月28日 03点12分
level 12
得到窗体的Handle,用SendMessage(Handle,WM_PAINT,Bitmap.Canvas.Handle,0);试试
2015年12月27日 08点12分 7
试了没效果的说
2015年12月28日 13点12分
level 10
其实条条大路通罗马,你完全可以将目标窗口还原大小并移动到屏幕以外,做完printwindow后再还原现场即可
2015年12月29日 06点12分 9
能说的易懂一点不[啊]
2015年12月30日 07点12分
我现在用取控件上某一点的像素 可以得到效果, 但是不停的在屏幕上取点,会使界面卡死[泪]
2015年12月30日 07点12分
1