如题 我在panel放视频
怎么才能抓正在播放的图
请高手帮忙

解决方案 »

  1.   

    跟你看的视频的渲染方式有关系,有些能用API抓到,有些抓不到
      

  2.   

    procedure TForm4.BitBtn1Click(Sender: TObject);
    var
      tBM : TBitmap;
    begin
      tBM := TBitmap.Create;
      ScreenShot(0,0,Screen.Width,Screen.height,tBM);
      tBM.SaveToFile('.\ScreenShot.BMP');
      tBm.FreeImage;
      FreeAndNil(tBM);
      image1.Picture.LoadFromFile('.\screenshot.bmp');
    end;//抓屏函数
    procedure TForm4.ScreenShot(x : integer; y : integer; Width : integer; Height : integer; bm : TBitMap);
    var
      dc: HDC; lpPal : PLOGPALETTE;
    begin
      // 检测所需抓屏的区域
      if ((Width = 0) or (Height = 0)) then exit;
      bm.Width := Width;
      bm.Height := Height;
      //获取设备上下文
      dc := GetDc(0);
      if (dc = 0) then exit;
      {do we have a palette device?}
      if (GetDeviceCaps(dc, RASTERCAPS) AND
        RC_PALETTE = RC_PALETTE) then
        begin
        {allocate memory for a logical palette}
        GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
        {zero it out to be neat}
        FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
        {fill in the palette version}
        lpPal^.palVersion := $300;
        {grab the system palette entries}
        lpPal^.palNumEntries :=
          GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
        if (lpPal^.PalNumEntries <> 0) then
        begin
          {create the palette}
          bm.Palette := CreatePalette(lpPal^);
        end;
        FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
        end;
      {copy from the screen to the bitmap}
      BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,x,y,SRCCOPY);
      {release the screen dc}
      ReleaseDc(0, dc);
    end;