各位前辈:
    小弟是个Delphi初学者,近日编了一个简单的抓屏程序,可是为什么用它抓一些播放
软件播放的视频图像,却只有背景,还有的就是有些偷屏软件也不能看到对方的视频文件,
请问有没有哪位大哥大姐能告诉小弟如何才能抓住和查看对方的视频文件。小弟先谢了!!!

解决方案 »

  1.   

    bitblt stretchblt 及copyrect都无法实现,用directdaw
      

  2.   

    var m_pDirectDraw:IDIRECTDRAW7;
        m_pDDSPrimary,m_pDDSBack:IDIRECTDRAWSURFACE7;
        ddsd,ddsd2,ddsdPrimary:TDDSURFACEDESC2;
    lpBuffer:PByte; ddsd2.dwSize := sizeof(ddsd2);
      ddsd2.dwFlags := DDSD_WIDTH or DDSD_HEIGHT or DDSD_CAPS;
      ddsd2.dwWidth := GetSystemMetrics(SM_CXSCREEN);
      ddsd2.dwHeight := GetSystemMetrics(SM_CYSCREEN);
      ddsd2.ddsCaps.dwCaps := DDSCAPS_SYSTEMMEMORY or DDSCAPS_OFFSCREENPLAIN;
      hRet := m_pDirectDraw.CreateSurface(ddsd2,m_pDDSBack,nil);
      if (hRet <> DD_OK) then
        begin
          MessageBox(self.Handle,'创建缓冲页面失败','警告',MB_OK);
          exit;
        end;  lpSrcRect := Rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));//hRet=AddAttachedSurface(m_pDDSPrimary);//  c4 := GetTickCount();    c1 := GetTickCount();
      hRet := m_pDDSBack.BltFast(0,0,m_pDDSPrimary,@lpSrcRect,DDBLTFAST_DONOTWAIT);
      c3:= GetTickCount();
      if (hRet <> DD_OK) then
        begin
          MessageBox(self.Handle,'复制页面失败','警告',MB_OK);
          exit;
        end;//lock
      ddsdPrimary.dwSize := sizeof(TDDSURFACEDESC2);
        //ddsdPrimarydwHeight =
     lpRect := Rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); hRet := m_pDDSBack.Lock( @lpRect, ddsdPrimary, DDLOCK_WAIT or DDLOCK_NOSYSLOCK, 0 ); lpBuffer := AllocMem(ddsdPrimary.dwHeight*ddsdPrimary.lPitch);
    CopyMemory (lpBuffer, ddsdPrimary.lpSurface,ddsdPrimary.dwHeight*ddsdPrimary.lPitch);
    //lpbuffer 图像数据
    // Unlock
    m_pDDSBack.Unlock(nil); c2 := GetTickCount();
                if( m_pDDSBack <> nil ) then//判断主页面对象是否为空
          begin
          //  m_pDDSBack._Release(); //释放
            m_pDDSBack := nil;
          end;