目的:抓取指定窗口的图像,即使该窗口被其他窗口遮盖。
代码:
function ShotScreen : TBitmap;
var
  Canvas : TCanvas;
  rect : TRect;
  HWin : THandle;
begin
  Result := Nil;
  HWin := GetDistWindow;//找到目的窗体的handle
  if HWin = 0 then Exit;
  GetWindowRect(HWin,Rect);
  with Rect do
  begin
    Right := Right - Left;
    Bottom := Bottom - Top;
    Left := 0;
    Top := 0;
  end;
  Result := Bitmap;//全局定义
  Result.Width := Rect.Right;
  Result.Height := Rect.Bottom;
  Canvas := TCanvas.Create;
  Canvas.Handle := GetDc(HWin);
  Result.Canvas.CopyRect(Rect,Canvas,Rect);
  ReleaseDc(HWin,Canvas.Handle);
  Canvas.Free;
end;问题:实际抓取的,是所有的窗口的图像。如果某个窗口遮盖了指定窗口,那么覆盖的窗口也被抓取。
另外,因为桌面上还需要其他程序显示,所以让指定窗口置顶的方法也是不行的。请指点!

解决方案 »

  1.   

    被覆盖了的窗口是没办法截到图的吧, 你截取的都是桌面DC里面的图片, QQ截图里面也一样的嘛, 不能截已覆盖的..只能把要截的窗口放最上面来.
      

  2.   

    我试了一下, 当你要截取的窗口被覆盖的时候, 它的DC里面显示的是覆盖在它上面的图像数据, 只有当它到最上面后, 系统调用它的OnDraw, 才使它的DC里面显示自己窗体的图像数据.. 所以不把它放到最上面来是截不到它真正的窗口图像数据的..
      

  3.   

    谢谢各位的捧场
    如果是只可以取到最顶层的图像,那么GETDC的参数,取0或别的窗口的handle,有什么区别呢?
      

  4.   

    用CallWindowProc, 
    LRESULT CallWindowProc(
      WNDPROC lpPrevWndFunc,  // pointer to previous procedure
      HWND hWnd,              // handle to window
      UINT Msg,               // message
      WPARAM wParam,          // first message parameter
      LPARAM lParam           // second message parameter
    );
     Msg为WM_PAINT
     wParam 为你要画的 HDC
      

  5.   

    GetDC的参数, 0是取得桌面窗口DC, handle的话是取得指定窗体客户区的DC, 也就是菜单下面的部分
      

  6.   

    也就是说, 你GetDC(handle)的话,只能截取指定窗口的窗户区图像,不包括窗口标题栏等,如果你要获得整个窗体的话,就必须GetDC(0),然后截取的时候指定开始位置座标到窗体的左上像素点.
      

  7.   

    tabby:getwindowdc就可以了吧
      

  8.   

    呵呵,没错,只是就GetDC而言嘛..你在问0跟handle的区别...