还是区域截图的问题
我的想法是本地载入一张图片 可以是image控件或者是其他的 然后在后台区域截图但是怎么才能做到后台区域截图 不是直接在webb里面截图了用区域截图的函数 用下面的函数 虽然句柄写正确以后 但是 在xp的电脑上 还是截图是屏幕的不是后台的程序的控件的截图而在vin7的电脑上却可以 求改正代码  个人觉得下面的代码好像只能截图屏幕的截图 而不能后台截图后没有后台区域截图的函数呢var
  bmpscreen:Tbitmap;
  jpegscreen:Tjpegimage;
  FullscreenCanvas:TCanvas;
  dc:HDC;
  sourceRect, destRect: TRect;
begin
  try
  //dc:=///GetWindow(GetWindow(form1.WebBrowser1.Handle, GW_CHILD), GW_CHILD);
  dc:=GetWindowDC(form1.Handle);
  //dc:=getdc(getdc(GetWindow(GetWindow(form1.WebBrowser1.Handle, GW_CHILD), GW_CHILD)));
 // dc:=getdc(form1.webbrowser1.Handle);
  ///showmessage(inttostr(dc)) ;
  fullscreencanvas:=Tcanvas.Create;
  fullscreencanvas.Handle:=dc;
  bmpscreen:=Tbitmap.create;
  bmpscreen.Width :=c-a;
  bmpscreen.Height :=d-b;
  sourcerect:=rect(0,0,c-a ,d-b );
  destrect:= rect(a,b,c,d);
  bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
  jpegscreen:=Tjpegimage.Create ;
  jpegscreen.Assign (bmpscreen);
  jpegscreen.CompressionQuality:=100;
  //jpegscreen.SaveToFile(pchar('c:\'+swj));
  jpegscreen.SaveToFile(pchar(ExtractFilePath(ParamStr(0))+swj));
  FullscreenCanvas.Free;
  bmpscreen.Free;
  jpegscreen.Free ;
  ReleaseDC(0, DC);
  except
  end;
end;

解决方案 »

  1.   


    var
      DC : HDC;
      hWindow , h : THandle;
      Canvas : TCanvas;
    begin
      hWindow := GetWindow(WebBrowser1.Handle , GW_CHILD);
      h := GetWindow(hWindow, GW_CHILD);
      if h<>0 then hWindow := H;
      Canvas := TCanvas.Create;
      DC := GetDC(hWindow);
      Canvas.Handle := DC;
      //使用Canvas作事
      Self.Canvas.CopyRect(Rect(0,0,200,200) , Canvas , Rect(50,50,250,250));
      //释放
      ReleaseDC(hWindow , DC);
      Canvas.Free;
    end;个人感觉XP下应该可行,没作试验,楼主自己试验一下,其实就是加了个判断....
      

  2.   

    事实证明 其实不行 不知道是不是我机器 原因 你能帮我测试一下嘛
    procedure tform1.snapscreenzd( swj:string ; a,b,c,d:Integer);
    var
      bmpscreen:Tbitmap;
      jpegscreen:Tjpegimage;
      FullscreenCanvas:TCanvas;
      dc:HDC;
      sourceRect, destRect: TRect;
      hWindow , h : THandle;
    begin
      try
      //dc:=///GetWindow(GetWindow(form1.WebBrowser1.Handle,   GW_CHILD),   GW_CHILD);
      ///dc:=getdc(GetWindow(GetWindow(form1.WebBrowser1.Handle,   GW_CHILD),   GW_CHILD));
      //dc:=getdc(getdc(GetWindow(GetWindow(form1.WebBrowser1.Handle,   GW_CHILD),   GW_CHILD)));
      hWindow := GetWindow(WebBrowser1.Handle , GW_CHILD);
      h := GetWindow(hWindow, GW_CHILD);
      if h<>0 then hWindow := H;
      dc:=getdc(hWindow);
      ///showmessage(inttostr(dc)) ;
      fullscreencanvas:=Tcanvas.Create;
      fullscreencanvas.Handle:=dc;
      bmpscreen:=Tbitmap.create;
      bmpscreen.Width :=c-a;
      bmpscreen.Height :=d-b;
      sourcerect:=rect(0,0,c-a ,d-b );
      destrect:= rect(a,b,c,d);
      bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
      jpegscreen:=Tjpegimage.Create ;
      jpegscreen.Assign (bmpscreen);
      jpegscreen.CompressionQuality:=100;
      //jpegscreen.SaveToFile(pchar('c:\'+swj));
      jpegscreen.SaveToFile(pchar(ExtractFilePath(ParamStr(0))+swj));
      FullscreenCanvas.Free;
      bmpscreen.Free;
      jpegscreen.Free ;
      ReleaseDC(hWindow, DC);
      except
      end;
    end;
      

  3.   

    我把句柄改成 form1.handle 也是不行 也是桌面的截图 所以我认为应该是函数的问题 有没有其他的函数 可以是区域截图的?
      

  4.   

    如果用getdc 最小化的窗口不行. 换个思路设置程序窗口坐标为-1000这样的, 让他跑到桌面外面去,截图后,恢复再最小化。