image1.Canvas.Handle改了,当然不对了!!!

解决方案 »

  1.   

    var
       dc:hdc;
       bmp:tbitmap;
    begin
       dc:=getdc(0);
       bmp:=tbitmap.create;
       bmp.width:=screen.Width;
       bmp.height:=screen.Height;
       bitblt(bmp.canvas.handle,0,0,bmp.width,bmp.height,dc,0,0,srccopy);
       Image1.Picture.Bitmap.Assign(bmp);
       bmp.free;
       releasedc(0,dc);
    end;
      

  2.   

    var DC : HDC;DC := GetDC(0);//取得桌面hdc;
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      SDC:HDC;
    begin
      SDC:=CreateDC('DISPLAY',nil,nil,nil);
      Image1.Width:=800;
      Image1.Height:=600;  BitBlt(Image1.Canvas.Handle,0,0,
             800,600,SDC,0,0,SRCCOPY);  Image1.Refresh;
      DeleteDC(SDC);
    end;
      

  4.   

    image1.Canvas.Handle  是image1内部TBitmap的handle,不能用GetDC(0)来得到的
      

  5.   

    是抓屏嘛??
    var
      dc:hdc;
      scrbitmap:Tbitmap;
    begin
      dc:=getdc(0);
      try
      scrbitmap:=Tbitmap.create;
      bitblt(scrbitmap.canvas.handle,0,0,200,300,dc,scrcopy);
      scrbitmap.savetofile(d:\dd.bmp);
      finnaly
      release(getdisktopwindow,dc);
      end;
      
    end;
      

  6.   

    这么辛苦,索性给你一段远程监控的代码吧。
    unit ClnUnit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, NMUDP;type
      TClient = class(TForm)
        CUDP: TNMUDP;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure CUDPDataReceived(Sender: TComponent; NumberBytes: Integer;
          FromIP: string; Port: Integer);
      private
        { Private declarations }
        procedure ScreenCap(LeftPos, TopPos,
          RightPos, BottomPos: integer);
      public
        { Public declarations }
      end;var
      Client: TClient;implementationconst BufSize = 2048; { 发送每一笔数据的缓冲区大小 }
    var
      BmpStream: TMemoryStream;
      LeftSize: Longint; { 发送每一笔数据后剩余的字节数 }{$R *.dfm}procedure TClient.FormCreate(Sender: TObject);
    begin
      BmpStream := TMemoryStream.Create;
    end;procedure TClient.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      BmpStream.Free;
    end;procedure TClient.CUDPDataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: string; Port: Integer);
    var
      CtrlCode: array[0..29] of char;
      Buf: array[0..BufSize - 1] of char;
      TmpStr: string;
      SendSize, LeftPos, TopPos, RightPos, BottomPos: integer;
    begin
      CUDP.ReadBuffer(CtrlCode, NumberBytes); { 读取控制码 }
      if CtrlCode[0] + CtrlCode[1] + CtrlCode[2] + CtrlCode[3] = 'show' then
      begin { 控制码前4位为“show”表示主控机发出了抓屏指令 }
        if BmpStream.Size = 0 then { 没有数据可发,必须截屏生成数据 }
        begin
          TmpStr := StrPas(CtrlCode);
          TmpStr := Copy(TmpStr, 5, Length(TmpStr) - 4);
          LeftPos := StrToInt(Copy(TmpStr, 1, Pos(':', TmpStr) - 1));
          TmpStr := Copy(TmpStr, Pos(':', TmpStr) + 1, Length(TmpStr)
            - Pos(':', TmpStr));
          TopPos := StrToInt(Copy(TmpStr, 1, Pos(':', TmpStr) - 1));
          TmpStr := Copy(TmpStr, Pos(':', TmpStr) + 1, Length(TmpStr) -
            Pos(':', TmpStr));
          RightPos := StrToInt(Copy(TmpStr, 1, Pos(':', TmpStr) - 1));
          BottomPos := StrToInt(Copy(TmpStr, Pos(':', TmpStr
            ) + 1, Length(TmpStr) - Pos(':', TmpStr)));
          ScreenCap(LeftPos, TopPos, RightPos, BottomPos); {截取屏幕 }
        end;
        if LeftSize > BufSize then
          SendSize := BufSize
        else
          SendSize := LeftSize;
        BmpStream.ReadBuffer(Buf, SendSize);
        LeftSize := LeftSize - SendSize;
        if LeftSize = 0 then
          BmpStream.Clear; { 清空流 }
        CUDP.RemoteHost := FromIP; { FromIP为主控机IP地址 }
        CUDP.SendBuffer(Buf, SendSize); { 将数据发到主控机的2222口 }
      end;
    end;procedure TClient.ScreenCap(LeftPos, TopPos,
      RightPos, BottomPos: integer);
    var
      RectWidth, RectHeight: integer;
      SourceDC, DestDC, Bhandle: integer;
      Bitmap: TBitmap;
    begin
      RectWidth := RightPos - LeftPos;
      RectHeight := BottomPos - TopPos;
      SourceDC := CreateDC('DISPLAY', '', '', nil);
      DestDC := CreateCompatibleDC(SourceDC);
      Bhandle := CreateCompatibleBitmap(SourceDC,
        RectWidth, RectHeight);
      SelectObject(DestDC, Bhandle);
      BitBlt(DestDC, 0, 0, RectWidth, RectHeight, SourceDC,
        LeftPos, TopPos, SRCCOPY);
      Bitmap := TBitmap.Create;
      Bitmap.Handle := BHandle;
      BitMap.SaveToStream(BmpStream);
      BmpStream.Position := 0;
      LeftSize := BmpStream.Size;
      Bitmap.Free;
      DeleteDC(DestDC);
      ReleaseDC(Bhandle, SourceDC);
    end;end.