user GDI APIprocedure TForm1.Button2Click(Sender: TObject);
var
  BmpBits:Pointer;
  FDeskHWnd:Hwnd;
  SourceDC,DestDC,originHandel:integer;
  i:Integer;
  ABitmap:HBitmap;
  BmpInfHead:TBitmapInfoHeader;
  Info : TBitMapInfo;
  bits:Pointer;
  Apointer:Pointer;
begin
  //Create DIB
  Info.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
  Info.bmiHeader.biWidth := WW; //width
  Info.bmiHeader.biHeight := HH; //height
  Info.bmiHeader.biPlanes := 1;
  Info.bmiHeader.biBitCount := 16;
  Info.bmiHeader.biClrUsed := 0;
  Info.bmiHeader.biCompression := BI_RGB;
  Info.bmiHeader.biClrImportant := 0;
  ABitmap := CreateDIBSection(SourceDC, Info, DIB_RGB_COLORS, APointer, 0, 0);  SourceDC:= GetDC(0);
  DestDC:=CreateCompatibleDC(SourceDC);
  ABitmap:=CreateCompatibleBitmap(SourceDC,WW,HH);
  originHandel:=selectObject(DestDC,Abitmap);
  BitBlt(DestDC,0,0,WW,HH,SourceDC,0,0,SRCCOPY);
  GetDIBits(DestDC,Abitmap,0,480,Apointer,info,DIB_RGB_COLORS);
  selectObject(DestDC,originHandel);
  DeleteDC(DestDC);
  ReleaseDC(0,SourceDC);
end;

解决方案 »

  1.   

    pocky, 你的方法只完成了前部分工作,我如何将得到的DC的具体内容保存到内存流中呢?
      

  2.   

    procedure TForm1.snapscreen();
    var
    bmpscreen:Tbitmap;
    jpegscreen:Tjpegimage;
    FullscreenCanvas:TCanvas;
    dc:HDC;
    sourceRect, destRect: TRect;
    begin
    dc:=getdc(0);
    fullscreencanvas:=Tcanvas.Create;
    fullscreencanvas.Handle:=dc;
    bmpscreen:=Tbitmap.create;
    bmpscreen.Width :=screen.Width ;
    bmpscreen.Height :=screen.Height ;
    sourcerect:=rect(0,0,screen.Width ,screen.Height );
    destrect:= rect(0,0,screen.Width ,screen.Height);
    bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
    jpegscreen:=Tjpegimage.Create ;
    jpegscreen.Assign (bmpscreen);
    jpegscreen.CompressionQuality:=40;
    jpegscreen.SaveToStream (jpegStream);
    jpegstream.Position :=0;
    LeftSize:=jpegStream.Size;
    FullscreenCanvas.Free;
    bmpscreen.Free;
    jpegscreen.Free ;
    ReleaseDC(0, DC);
    end;
      

  3.   

    楼上先生,我有一个前提,就是不能引用GRAPHICS单元,何来Tbitmap ?
    你的方法我也知道。
    各路大虾,还需加油啊!
      

  4.   

    小子,想写“最小”的木马服务端程序吗?HE,HE.......
      

  5.   

        也可以这么说吧,不过不是木马,是个服务程序之类的。
    反正我觉得如果写一个在后台运行的服务程序,应该像个服务程序的样儿,不可以有三百多K,
    多吓人,虽然现在电脑内存越来越海量,也不应该这样浪费.(人家用C写的服务程序都只有几十K
    的,不过他们可恨的是有Microsoft的MFC运行库支持,不过他不支持Delphi,只有自己做).    我不害人,因为我善良。
      

  6.   

    上面取得的是屏幕数据的指针 和大小.   下面就可以直接写到 stream里了