抓屏问题!100分 image1.Canvas.Handle改了,当然不对了!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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; var DC : HDC;DC := GetDC(0);//取得桌面hdc; 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; image1.Canvas.Handle 是image1内部TBitmap的handle,不能用GetDC(0)来得到的 是抓屏嘛??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; 这么辛苦,索性给你一段远程监控的代码吧。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. 赋于一个变量一个数据组 谁用过RemObjects啊?它的SOAP怎么才能被Java或.Net引用啊! 如何检测屏蔽键盘钩子的拦截 急!! 高分求助! 一个MDI问题 请教word中插图片的问题? 谁有串口控制录音的原代码? 在线等:有关Treeview的问题 使用什么样的API函数可以获取Internet上的文件大小? 如何将硬盘里的一个网页快捷方式拷贝到桌面上 如何制作国际版的软件? ...送分...求代码,关于局域网中文件的实时传递... 如何去掉dbgrid标题之间的网格线。
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;
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;
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;
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.