求最快的截屏函数!最好是 50ms 之内!(100分)

  • 主题发起人 主题发起人 wanggongqin
  • 开始时间 开始时间
W

wanggongqin

Unregistered / Unconfirmed
GUEST, unregistred user!
用 GetDC 的方法截屏大概耗时 180ms 左右。这对于远程控制来说显然是太慢了,
有没有更快的截屏方法。
听说设置系统重画钩子可以只截取屏幕变化的部分,从而可以提高速度。
这种使用钩子的方法,怎么作呢?
有另外的办法也行,只要够快就行!
 
前几天在盒子看到有差异截图的例子
http://www.delphibox.com/article.asp?articleid=3710
 
这个例子代码很乱,而且运行后,我也没发现有多快。
它还使用了第三方控件,要想从这个第三方控件中找出截屏代码来是太困难了!
 
远程传输,建议参考 VNC 的代码
 
VNC 的代码我看不懂啊!
 
拦截bitblt的API函数
 
如何拦截?使用钩子吗?请给详细的说明,好吗?
 
一般都是钩子与分块混用,如果只是用钩子的话,有些更新也是不及时的,我已经测试了VNC的钩子,把VNC转化为DELPHI也完成,几乎与VNC差不多,而且支持系统自动转化256色
 
钩子+mirro驱动
 
to xmcccc:
能否将你的转换为 Delphi 的 VNC 代码发给我?
 
我的邮箱是 wgqsoft@126.com
 
第1章 界面开发实例


实例6 动态抓取屏幕


本实例将制作一个能够随时抓取屏幕图像的软件。



在窗体中添加TImageList组件、TMainMenu组件、TSavePictureDialg组件、TTollBar组件和TImage组件,TImage组件用来显示一幅图片,TTrackBar组件用于调节窗体的透明度。添加组件后的窗体如图1-12所示。



图1-12 添加组件后的窗体



本程序的核心是CaptureScreen函数,通过它可以完成抓取屏幕图像的操作,代码如下:

procedure TfrmMain.CaptureScreen();

var

Fullscreen:TBitmap;

FullscreenCanvas:TCanvas;

DC:HDC;

begin

Fullscreen:=TBitmap.Create;

Fullscreen.Width:=screen.width;

Fullscreen.Height:=screen.Height;

DC:=GetDC(0);

//取得屏幕的DC,参数0指的是屏幕

FullscreenCanvas:=TCanvas.Create;

//创建一个CANVAS对象

FullscreenCanvas.Handle:=DC;

Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),

fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));

//把整个屏幕复制到BITMAP中

FullscreenCanvas.Free;

ReleaseDC(0,DC);

//释放DC

Image1.Picture.Bitmap:=fullscreen;

Image1.Width:=fullscreen.Width;

Image1.Height:=fullscreen.Height;

fullscreen.free;

end;

抓取屏幕图像的难点有两个:一是如何获取屏幕的句柄,二是知道屏幕句柄后如何获取屏幕的图像。

首先定义一个HDC类型的变量DC,在程序中通过DC:=GetDC(0)语句就可以获取屏幕的句柄。然后创建一个TCanvas 类型的变量FullscreenCanvas,通过设置它的Handle属性为DC就可以把屏幕的图像关联到FullscreenCanvas中。最后通过语句Fullscreen.Canvas. CopyRect( Rect(0, 0, screen.Width, screen.Height), fullscreenCanvas, Rect(0, 0, Screen.Width, Screen.Height))把fullscreenCanvas中存储的屏幕图像提取到TBitmap类型的变量Fullscreen中。存储到Fullscreen中的图像可以很容易地显示在窗体上的TImage组件中。

当然,用户也可以通过选择菜单“文件”|“保存”选项,来存储抓取完成的屏幕图像。



程序代码如下:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, Menus, ComCtrls, ToolWin, ImgList, ExtDlgs;

type

TfrmMain = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

Image1: TImage;

ImageList1: TImageList;

mnuSave: TMenuItem;

N3: TMenuItem;

mnuExit: TMenuItem;

ToolBar1: TToolBar;

ToolButton1: TToolButton;

ToolButton2: TToolButton;

mnuCapture: TMenuItem;

SavePictureDialog1: TSavePictureDialog;

procedure mnuCaptureClick(Sender: TObject);

procedure CaptureScreen();

procedure mnuExitClick(Sender: TObject);

procedure mnuSaveClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

{$R *.dfm}



procedure TfrmMain.mnuCaptureClick(Sender: TObject);

begin

self.WindowState:=wsMinimized;

//最小化程序窗口

self.hide;

//把程序藏起来

CaptureScreen;

self.WindowState:=wsNormal;

//复原窗口状态

self.show;

//显示窗口

end;



procedure TfrmMain.CaptureScreen();

var

Fullscreen:Tbitmap;

FullscreenCanvas:TCanvas;

dc:HDC;

begin

Fullscreen:=TBitmap.Create;

//创建一个BITMAP来存放图像

Fullscreen.Width:=screen.width;

Fullscreen.Height:=screen.Height;

DC:=GetDC(0);

//取得屏幕的DC,参数0指的是屏幕

FullscreenCanvas:=TCanvas.Create;

//创建一个CANVAS对象

FullscreenCanvas.Handle:=DC;



Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),

fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));

//把整个屏幕复制到BITMAP中

FullscreenCanvas.Free;

//释放CANVAS对象

ReleaseDC(0,DC);

//释放DC



Image1.Picture.Bitmap:=fullscreen;

//拷贝下来的图像赋给IMAGE对象

Image1.Width:=fullscreen.Width;

Image1.Height:=fullscreen.Height;

fullscreen.free;

//释放bitmap

end;



procedure TfrmMain.mnuExitClick(Sender: TObject);

begin

Application.Terminate;

end;



procedure TfrmMain.mnuSaveClick(Sender: TObject);

begin

if self.SavePictureDialog1.Execute then

self.Image1.Picture.SaveToFile(self.SavePictureDialog1.FileName);

end;

end.



保存文件,然后按F9键运行程序,程序运行的初始画面如图1-13所示。

选择菜单“文件”中的“抓取屏幕”项,程序首先会隐藏自己。抓取屏幕完成后程序会自动恢复正常显示,并且显示抓取完成的屏幕图像,如图1-14所示。



通过这个实例,读者可以学习到如何通过程序抓取屏幕图像。读者可以进一步思考,如何制作可以抓取任何窗口的抓图软件。



图1-13 程序运行的初始画面 图1-14 程序运行结果
 
键盘上有抓屏的键,想办法模拟这个键?或是还有什么未公开的API?
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
926
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部