DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: lorangeve
今日帖子: 41
在线用户: 14
导航: 论坛 -> 网络通讯 斑竹:liumazi,sephil  
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/2/11 17:30:38
标题:
征集最快的网络屏幕传输原理和代码(不用Mirror驱动)!超过Radmin和最新版的黑洞2007(v1.x) 浏览:24967
加入我的收藏
楼主: 我分析了Radmin的抓屏和显屏API代码,抓屏它采用的是逐行扫描,显屏它采用的是全屏显示。就是不知道他使用的什么压缩,他发送时好像没有用内存XOR运算发送不同的数据,但不知道他使用什么压缩方法发送的。

r_server
  SRCCOPY     = $00CC0020;     { dest = source       


function CreateDCA(lpszDriver, lpszDevice, lpszOutput: PAnsiChar;
  lpdvmInit: PDeviceModeA): HDC; stdcall;

lpszDriver  'DISPLAY'
lpszDevice  nil
lpszOutput  nil
lpdvmInit  nil

function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;

DC  CreateDCA 的返回值
Index  RASTERCAPS    = 38;    { Bitblt capabilities    

function CreateCompatibleDC(DC: HDC): HDC; stdcall;

DC  CreateDCA 的返回值

function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;

DC  CreateDCA 的返回值
Index  HORZRES       = 8;     { Horizontal width in pixels       

function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;

DC  CreateDCA 的返回值
Index  VERTRES       = 10;    { Vertical height in pixels      

function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP; stdcall;

DC  CreateDCA 的返回值
Width  GetDeviceCaps HORZRES的返回值
Height  0x00000001

function GetObjectA(p1: HGDIOBJ; p2: Integer; p3: Pointer): Integer; stdcall;

p1  CreateCompatibleBitmap 的返回值
p2  ?24
p3  ?

function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;

DC  CreateCompatibleDC 的返回值
Index  RASTERCAPS    = 38;    { Bitblt capabilities    


function GetDeviceCaps(DC: HDC; Index: Integer): Integer; stdcall;

DC  CreateCompatibleDC 的返回值
Index  BITSPIXEL     = 12;    { Number of bits per pixel    

function CreateBitmap(Width, Height: Integer; Planes, BitCount: Longint;
  Bits: Pointer): HBITMAP; stdcall;

Width    5
Height    1
Planes    1
BitCount  10
Bits    0

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC  CreateCompatibleDC 的返回值
p2  CreateBitmap 的返回值

function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;

DC  CreateCompatibleDC 的返回值
X  0x00000000
Y  0x00000000
Color  0x000000FF

function GetBitmapBits(Bitmap: HBITMAP; Count: Longint;
  Bits: Pointer): Longint; stdcall;

Bitmap  CreateBitmap 的返回值
Count  0x00000002
Bits

function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;

DC  CreateCompatibleDC 的返回值
X  0x00000000
Y  0x00000000
Color  0x0000FF00

function GetBitmapBits(Bitmap: HBITMAP; Count: Longint;
  Bits: Pointer): Longint; stdcall;

Bitmap  CreateBitmap 的返回值
Count  0x00000002
Bits  

function SetPixel(DC: HDC; X, Y: Integer; Color: COLORREF): COLORREF; stdcall;

DC  CreateCompatibleDC 的返回值
X  0x00000000
Y  0x00000000
Color  0x00FF0000

function GetBitmapBits(Bitmap: HBITMAP; Count: Longint;
  Bits: Pointer): Longint; stdcall;

Bitmap  CreateBitmap 的返回值
Count  0x00000002
Bits  

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC  CreateCompatibleDC 的返回值
p2  SelectObject 的返回值

function DeleteObject(p1: HGDIOBJ): BOOL; stdcall;

p1  CreateBitmap 的返回值

function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBITMAP; stdcall;

DC  CreateDCA 的返回值
Width  0x00000400
Height  0x00000015

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC  CreateCompatibleDC 的返回值
p2  CreateCompatibleBitmap 的返回值


function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
  XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;

DestDC  CreateCompatibleDC 的返回值
X  0x00000000
Y  0x00000000
Width  0x00000400
Height  0x00000001 变
SrcDC  CreateDCA 的返回值
XSrc  0x00000000 变
YSrc  0x0000000F 变
Rop  SRCCOPY 

function GetDIBits(DC: HDC; Bitmap: HBitmap; StartScan, NumScans: UINT;
  Bits: Pointer; var BitInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;

DC    CreateCompatibleDC 的返回值
Bitmap    CreateCompatibleBitmap 的返回值
StartScan  0x00000000
NumScans  0x00000001
Bits      
BitInfo    
Usage    0x00000000

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC  CreateCompatibleDC 的返回值
p2  CreateCompatibleBitmap 的返回值

function DeleteDC(DC: HDC): BOOL; stdcall;

DC  CreateDCA 的返回值

function DeleteDC(DC: HDC): BOOL; stdcall;

DC  CreateCompatibleDC 的返回值

function DeleteObject(p1: HGDIOBJ): BOOL; stdcall;

p1  SelectObject 的返回值

radmin

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC
p2

function ExtCreateRegion(XForm: PXForm; Count: DWORD; const RgnData: TRgnData): HRGN; stdcall;

XForm    nil 单元转换
Count    数据大小
RgnData    数据

function SelectClipRgn(DC: HDC; Region: HRGN): Integer; stdcall; -> ->

DC    SelectObject 的DC
Region    ExtCreateRegion 的返回值
返回值    COMPLEXREGION = 3

function SetDIBitsToDevice(DC: HDC; DestX, DestY: Integer; Width, Height: DWORD;
  SrcX, SrcY: Integer; nStartScan, NumScans: UINT; Bits: Pointer;
  var BitsInfo: TBitmapInfo; Usage: UINT): Integer; stdcall;

DC    SelectObject 的DC
DestX    0 服务端屏幕X
DestY    0 服务端屏幕Y
Width    $320 服务端屏幕Width
Height    $258 服务端屏幕Height
SrcX    0
SrcY    0
nStartScan  0
NumScans  $258
Bits    数据?
BitsInfo
Usage      不知道DIB_RGB_COLORS

function SelectClipRgn(DC: HDC; Region: HRGN): Integer; stdcall; -> 

DC    SelectObject 的DC
Region    0
返回值    SIMPLEREGION = 2

function DeleteObject(p1: HGDIOBJ): BOOL; stdcall;

p1    ExtCreateRegion 的返回值

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC    原 SelectObject 的DC  
p2    上一个 SelectObject 的返回值

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC    原 SelectObject 的DC
p2    上一个 SelectObject 的返回值

普通模式

function BitBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
  XSrc, YSrc: Integer; Rop: DWORD): BOOL; stdcall;

DestDC    
X    0 服务端屏幕X
Y    0 服务端屏幕Y
Width    $320 服务端屏幕Width
Height    $258 服务端屏幕Height
SrcDC    上一个 SelectObject 的返回值 = 上一个 SelectObject 的DC= 原 SelectObject 的DC
XSrc    0
YSrc    0
Rop    SRCCOPY


伸拉模式

function SetStretchBltMode(DC: HDC; StretchMode: Integer): Integer; stdcall;

DC
StretchMode

function StretchBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC;
  XSrc, YSrc, SrcWidth, SrcHeight: Integer; Rop: DWORD): BOOL; stdcall;

DestDC
X
Y
Width
Height
SrcDC
XSrc
YSrc
SrcWidth
SrcHeight
Rop

function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; stdcall;

DC    上一个 SelectObject 的返回值 = 上一个 SelectObject 的DC= 原 SelectObject 的DC
p2    上一个 SelectObject 的返回值

上面是Radmin和R_server所用抓屏和显屏的API函数
他怎么用SetPixel和GetBitmapBits把RGB三种颜色分离成三个流的,是不是位and运算?如果这样分离,压缩率也不会很高的呀!
大家是否有Radmin的C++源代码呀?能否给小弟看一看呀?
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/2/12 13:25:09
1楼: 也想知道,黑洞的作者陳經韜太喜歡吹噓自己了,從來沒告訴過大家一點思路。

兄弟的分析還要詳細一點,摸清大致的思路才行。
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/2/12 15:28:58
2楼: 1024*768*32 BitBlt = 30ms - 50ms
ZLib壓縮 = 90ms - 150ms
傳輸 = 20ms

所以要想達到40貞/秒,不可能整屏讀取,不能大數據壓縮。

不知道老兄是怎麼知道RA是逐行掃描而不是分塊掃描,希望多多討論。
----------------------------------------------
-
作者:
男 pl9165 (圣战天使) ★☆☆☆☆ -
普通会员
2007/2/12 16:37:40
3楼: 我也很想知道啊,希望大家一起讨论出一个最好得方案
听说使用DDK编写比较好,可是完全不懂,汗~~~
希望高手们多告诉我们一点
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/2/13 13:34:54
4楼: 用API调试工具调试Radmin的服务端就可知道他是逐行扫描了
SimpleSC, ScreenSpy 是分块扫描的,也非常快
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/2/13 15:32:08
5楼: 我做過分塊掃描,能達到10貞/秒的速度,數據量也比較小,但主要是占了70%的CPU,不好用。
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/2/13 15:35:43
6楼: SimpleSC, ScreenSpy 的代碼我也分析過,也是占CPU,被動掃描我覺得是不可取得。所以想改用HOOK做,減少CPU的占用率。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/2/13 15:52:43
7楼: 你用Hook做?APIHook?那9x下能够正常工作?我有9x下系统级WideHook的代码!不用vxd驱动的!
参考VNC的代码?Radmin v2.x 可没用Hook做,cpu占用率也不大呀!
我的QQ:523595680
我的QQ群:16973143
共同探讨世界上最快的屏幕传输和世界上最强的Hook!!!
----------------------------------------------
-
作者:
男 caicui (傲视天下) ★☆☆☆☆ -
普通会员
2007/2/26 13:36:40
8楼: 我一点都不懂啊。你们怎么学的啊
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/3/6 7:52:22
9楼: 希望更多的成員加入,一起進步。
----------------------------------------------
-
作者:
男 galangzi (cookiss) ★☆☆☆☆ -
普通会员
2007/4/12 11:09:13
10楼: 看鸟 
但是
不是很懂额
----------------------------------------------
-
作者:
男 luckypig (luckypig) ★☆☆☆☆ -
盒子活跃会员
2007/4/13 11:23:13
11楼: 这些很厉害吗?

我怎么看,都觉得不如 M$ 的远程桌面和终端服务呢?
----------------------------------------------
-
作者:
男 westcity (westcity) ★☆☆☆☆ -
普通会员
2007/6/24 22:22:37
15楼: CPU占用还有点大
----------------------------------------------
ASM+Delphi
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/6/25 13:32:55
16楼: 當然有低CPU占用的50偵版本。
----------------------------------------------
-
作者:
男 qq168sky (qq168sky) ★☆☆☆☆ -
普通会员
2007/7/1 13:01:49
19楼: 可以 给 个 源代码 谢谢了 不 知道 是 不 是 DELPHI写的
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/7/1 16:32:44
20楼: 是 DELPHI写的
源代码现在还不能公布!
----------------------------------------------
-
作者:
男 qq168sky (qq168sky) ★☆☆☆☆ -
普通会员
2007/7/1 23:32:17
21楼: 速度的确不错的 判楼主的 代码了 学习啊
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/7/6 16:01:33
22楼: 准備開發遠控程序,歡迎有意向、合作精神而且在遠控方面有水平的同道加入。
----------------------------------------------
-
作者:
男 ysq8101 (龙哲) ★☆☆☆☆ -
盒子活跃会员
2007/7/9 9:13:24
23楼: lz,请问你用什么工具分析Radmin的抓屏和显屏API代码?
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/7/9 14:49:33
24楼: DebugAPISpy
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/8/4 7:58:15
30楼: 能屏蔽廣告不錯,這個垃圾又來了。
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/8/4 16:00:11
31楼: 還應該直接刪除發貼記錄,更新順序全亂了。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/8/6 16:36:23
32楼: 出新版本了!
GDI_GMSS v0.1f 服务端准备-〉0% cpu占用!
此帖子包含附件:genius2005_200786163617.rar 大小:283.2K
----------------------------------------------
-
作者:
男 bootdisk (逆风) ★☆☆☆☆ -
普通会员
2007/8/8 9:43:52
33楼: 楼上讲讲原理
----------------------------------------------
-
作者:
男 xicao54007 (xicao54007) ★☆☆☆☆ -
普通会员
2007/8/13 6:24:05
34楼: 就是啊,讲讲原理啊
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/8/15 13:23:33
35楼: GDI_GMSS v0.1h 版本超强!
----------------------------------------------
-
作者:
男 21006091 (21006091) ★☆☆☆☆ -
普通会员
2007/9/24 6:41:48
36楼: 怎么没下文了?
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2007/9/26 10:09:44
37楼: 第一段落結束了,正在做遠程控件軟件開發,暫時不會再做這方面的研究。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/10/14 16:32:06
38楼: lzo压缩算法不错!使GDI的速度与Mirror驱动的速度差不多了!
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2007/10/20 13:40:40
39楼: 出新版本了!
GDI_GMSS v0.1h
为了防止非法滥用此程序,此程序采用了反弹作者IP地址的技术!
此帖子包含附件:genius2005_20071020134036.rar 大小:246.4K
----------------------------------------------
-
作者:
男 lobtao (lob) ★☆☆☆☆ -
普通会员
2007/12/29 18:01:54
40楼: 黑洞是我见过最快的
----------------------------------------------
没有做不到,只有想不到。
bolg:http://hi.baidu.com/lobtao
Email:lobtao@qq.com
QQ:369687916
作者:
男 geoh (Fly) ★☆☆☆☆ -
普通会员
2008/3/14 10:02:55
41楼: UltraVNC 是开源的
貌似是用VC写的!
----------------------------------------------
卖电脑上网!
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2008/3/31 14:24:15
42楼: 我可以说我这个肯定比黑洞快,而且占用CPU比黑洞低,传输数据量比黑洞小!
----------------------------------------------
-
作者:
男 neqi_jj (neqi_jj) ★☆☆☆☆ -
普通会员
2008/4/21 11:36:00
43楼: 真的这么牛。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2008/4/26 14:21:06
46楼: GDI_MRSS_D v0.1q Build 080401 最新版
發佈日期:2008年04月26日
此帖子包含附件:genius2005_200842614214.rar 大小:检测失败
----------------------------------------------
-
作者:
男 smial (smial) ★☆☆☆☆ -
普通会员
2008/6/20 21:11:39
47楼: 楼上的给我分析下你的源码。。。。
----------------------------------------------
-
作者:
男 udbusradn (udbusradn) ★☆☆☆☆ -
普通会员
2008/7/2 9:46:32
48楼: 不要把问题的讨论和厉害不厉害,高手不高手,这类话题扯到一起。不会的人想学的就学学了,会的人也说说自己的看法,这在个平台里就是技术交流。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2008/7/3 17:43:17
49楼: 对,这个就是扫描屏幕变化的地方呀,其实还有很多方法呢!
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2008/7/8 13:24:17
50楼: GDI_MRSS_D v0.1r 马上就要发布了。。。。。。。。。。
----------------------------------------------
-
作者:
男 dalongx (dalong) ★☆☆☆☆ -
普通会员
2008/7/8 15:10:36
51楼: 呵呵,希望学习大作,最好代码能开源,呵呵
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2008/9/12 12:10:06
52楼: 原理是最要的,优化其次重要!代码只是实现而已!
----------------------------------------------
-
作者:
男 gattaca (gattaca) ★☆☆☆☆ -
普通会员
2008/9/12 13:15:47
53楼: 請問genius2005,
你的新版可在Delphi2009編譯成功嗎?
----------------------------------------------
-
作者:
男 xjl (jack) ★☆☆☆☆ -
盒子活跃会员
2008/9/12 16:33:15
54楼: ----------
假设服务端是被控制的机器,客户端是控制的机器。
1、把服务端的屏幕发送次数设成每发送M=30次数据后发一个全屏包给客户端,其余时间服务端在发送前把屏幕分害成40*30块与上一次发送的数据进行对比,把不同的数据进行发送。
2、在遇到需要全屏进行传送的时候(比如打开新的窗口),记得使M=0。
3、把屏幕图像存成JPG格式,另外变成256色,分辨率降低,屏幕拉升等。
----------

----------
另外,个人感觉Windows应该有一个总控的屏幕刷新程序(比较底层的),换句话说就是驱动程序 Screen.drv ,如果控制这个程序应该比较方便。
----------------------------------------------
-
作者:
男 blueflag (昆了) ★☆☆☆☆ -
盒子活跃会员
2008/9/14 16:49:39
55楼: 开源开源开源,你的 
GDI_MRSS_D v0.1q Build 080401 最新版
發佈日期:2008年04月26日 
有病毒~~~~~~~~
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2008/12/12 14:16:36
56楼: 我的新版完全可在Delphi2009编译成功!
----------------------------------------------
-
作者:
男 windlove520 (Delphi) ★☆☆☆☆ -
普通会员
2009/5/16 10:52:43
57楼: 帮顶
----------------------------------------------
-
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2009/5/17 16:42:10
58楼: 关注
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 winmillion (Winmillion) ★☆☆☆☆ -
普通会员
2009/5/30 19:29:06
59楼: 个人觉得除了3389屏幕传输压缩算法,过来就是Ramin了.
----------------------------------------------
My Blog:http://hi.baidu.com/winmillion
作者:
男 xndd (xndd) ★☆☆☆☆ -
盒子活跃会员
2009/7/9 11:15:32
60楼: 佩服!我就知道好像Radmin是扫描完与之前数据对比,如果不同才更新数据,节省传输时间
----------------------------------------------
-
作者:
男 hujiacheng ( 旺财) ★☆☆☆☆ -
普通会员
2009/8/11 16:28:31
61楼: GIF理论。~!
----------------------------------------------
免费的FTPhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi.icm.edu.pl/ftp/https://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2009/8/17 13:43:36
62楼: 3389傳輸的是GDI指令
而這種傳輸的是位圖

要想快,就要盡量只傳輸變化部分,
好的算法在於快速地找出變化部分,
這也是不同算法的唯一區別。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2009/9/10 13:51:48
63楼: GDI_MRSS_D v0.1t 新版本,速度更快。内核使用Delphi 2010编译,无壳。
请正向连接,右击列表框添加主机,然后输入IP地址双击连接。
此帖子包含附件:genius2005_2009910135145.rar 大小:141.2K
----------------------------------------------
-
作者:
男 g0ug0u (gougou) ★☆☆☆☆ -
普通会员
2009/9/17 9:18:35
64楼: 楼上的 为啥我本地测试虚拟机 屏幕最上方一直闪呢
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2009/9/21 22:19:40
65楼: 什么地方闪呢?加我QQ:535676060
----------------------------------------------
-
作者:
男 yxf5188 (易旋风) ★☆☆☆☆ -
普通会员
2009/9/22 10:38:36
66楼: GDI_MRSS_D v0.1t不错,
建议如下改改,就可以商用了:
   1、插入系统进程运行,看不到自身进程。
   2、增加反弹连接,自动报告上线!

我自己弄了个屏幕传输,已实现屏幕监控和远程控制,目前卡在插入explorer.exe上了。有的机器开启了DEP保护、NX保护,插入时,会提示“内存不能为write”。想了很多办法,包括用驱动去除保护,都不成功。

genius2005,你准备用什么方式,静默安装你的服务端到其他机器上呢?!
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2009/9/24 0:18:45
67楼: 没有合适的方式,尤其在Vista没有办法过……
----------------------------------------------
-
作者:
男 iroyal (风清云淡) ★☆☆☆☆ -
普通会员
2009/10/30 15:48:34
68楼: 好贴啊。关注,说说原理嘛。
----------------------------------------------
-
作者:
男 mj5423 (mj5423) ★☆☆☆☆ -
盒子活跃会员
2009/11/2 1:13:08
69楼: 楼主,能提供个DebugAPISpy的注册码吗?
----------------------------------------------
-
作者:
男 bmsr (白忙剩人) ★☆☆☆☆ -
普通会员
2010/1/25 17:47:40
70楼: 1.将屏幕分成分成3X3 或4X4 5X5(根据画面变化频率)多线程抓取 每个线程负责一块
3.每线程计算存储自己那块块的校验码.
4.比较原有校验码,相同放弃,不同重复1~4 一致到定义的最小矩形(这个最小矩形传输时间将接近的校验时间),仍不同则传输.

这里关键是校验程序要速度快且又能反映变化的大小
----------------------------------------------
http://blog.sina.com.cn/bmsrnote
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2010/3/7 19:54:54
71楼: GDI_RDPS_D v0.1a 新版本,速度更快。内核使用Delphi 2010编译,与Radmin v3.4还快,CPU还低!
----------------------------------------------
-
作者:
男 mondaywoo (mondaywoo) ★☆☆☆☆ -
普通会员
2010/3/7 21:59:25
72楼: 关注,学习。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2010/3/13 13:46:08
73楼: 市面上的mirror驱动并非能达到最快的屏幕速度,Ring3完全能模拟出那种速度来!

Miskya QQ:386868907
----------------------------------------------
-
作者:
男 guanyueguan (gyg) ★☆☆☆☆ -
盒子活跃会员
2010/7/21 11:10:35
74楼: http://www.2ccc.com/article.asp?articleid=5724

經典、高效、免費的代碼來了
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2012/3/27 21:20:55
76楼: 楼上是?
----------------------------------------------
-
作者:
男 hawke2e (hawke2e) ★☆☆☆☆ -
普通会员
2015/1/17 14:38:19
77楼: 没研究过,细节说不上。想了下,有个逻辑摆在那:
如果全屏传输能满足要求,那就没什么问题。
如果全屏不能满足,那肯定是差别传输,就要以块(或者是10*10,或者是1*1,或者其它)为单位来检测变化。
如果全部块检测一遍性能差,那只能抽查,发现哪个块发生变化则连同附近的若干块一并传输。
因为界面变化大多数有连续特点,也就此刻这点变化,那下一时刻多半附近会起变化。
既然抽查,就涉及概率,这是数学,门槛高着呢。

如果我的逻辑正确,那网上的源码里如果不涉及概率和神经网络,都不会是最快的解决方案;另外,数学模型这是门槛,这是专利,哪那么容易透露。
----------------------------------------------
软件是什么,相信很多人都说不清。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2015/5/28 11:54:32
78楼: 推荐一本书:[计算机图形学的算法基础].Procederal.Elements.for.Computer.Graphics.(美)Rogers.扫描版.pdf
这书完美阐述了,电视机的工作原理,这类屏幕传图,原理就是电视机的那东东。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 changson (changson) ▲▲▲▲△ -
普通会员
2015/7/9 19:41:49
79楼: 用Hook效率可以到30帧吗
有没大大有其他更好的方案?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2015/11/30 14:40:06
80楼: 这个问题还这么多人讨论?我老人家10多年前就干过了。不外乎两种:

1. WIENDOWS 终端 3389 的方式。这个需要有资料,能拿到 WINDOWS 的屏幕的数据,它不是传图,所以带宽消耗少,快。

2. 抓屏幕图像。问题是如果全屏,肯定数据里巨大,带宽不够,慢。So...这里办法就多了。参考 VNC 吧:

2.1. 有人说抓全屏,分块,然后比较,只传变化的部分。这个思路挺好。就是消耗CPU。因为全屏的图像数据非常多,比较下去,每秒N次,CPU 忙不过来。

2.2. VNC 的方法:用 HOOK ,当 WINDOWS 重绘屏幕的时候,会给出消息。抓住这个消息,能够获得屏幕变化的 Rect 坐标。当然,这个消息来得非常快,没必要每个这样的消息你都抓图去传输。VNC 是合并多个这样的消息的 RECT 区块,然后将合并后的区块的屏幕抓下来,这样就不是全屏,只是一部分屏幕。然后,再将抓下来的,和上次屏幕同一个区块的比较一次,变了的,才发。VNC 这里是分 64X64的小方块来比较的。

2.3. 更进一步,HOOK 的效率还是低。如果能够用虚拟显卡驱动来获取屏幕变化,效率更高。

3. 有必要每秒30祯吗?屏幕要一直不变化,你每秒1祯都不应该有。So....你应该怎么处理呢?
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/7/29 13:11:18
81楼: 求楼上老人家 办法 1 的 代码 DEMO。
感谢 楼上老人家 2.2 的说明。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2017/7/15 16:20:30
82楼:  pcplayer 大侠, 厉害啊!!!
----------------------------------------------
kittyapp
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2017/9/9 20:32:21
83楼: 苹果茶网络共享v3.3绿色版 http://www.aptea.top
可直接借助Windows远程桌面等进行远程访问,无须路由进行端口映射。
QQ群:548267270 苹果茶网络共享与管理
----------------------------------------------
-
作者:
男 hujiacheng ( 旺财) ★☆☆☆☆ -
普通会员
2017/9/10 10:04:17
84楼: ...挖坑。。
----------------------------------------------
免费的FTPhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi.icm.edu.pl/ftp/https://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019
作者:
男 learndelphi (beside) ★☆☆☆☆ -
盒子活跃会员
2017/9/10 14:47:44
85楼: 哇,无比佩服楼主。
----------------------------------------------
-
作者:
男 glwang (glwang) ★☆☆☆☆ -
盒子活跃会员
2019/2/11 17:18:17
86楼: “陳經韜”好熟悉的名字,好像在原来的Delphi大富翁网站里面的
----------------------------------------------
作者:
男 hexi (Hexi) ★☆☆☆☆ -
盒子活跃会员
2019/2/11 22:35:59
87楼: 提供个思路:可以研究通过显卡编程进行比较及压缩处理,这样CPU可能占用可以接近0,帧频也高。
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2019/2/18 15:38:58
88楼: Windows桌面共享中一些常见的抓屏技术
http://www.cppblog.com/weiym/archive/2013/12/01/204536.html
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2019/2/18 15:56:33
89楼: DXGI快速截屏录屏技术
http://www.cnblogs.com/haibindev/archive/2017/12/20/8072409.html
----------------------------------------------
-
作者:
男 jackalan (nVicen) ★☆☆☆☆ -
盒子活跃会员
2019/12/8 9:30:18
90楼: 传输速度只是远程控制的一部分而已,例如未登陆状态时桌面还未创建,如何读取登陆前的屏幕。
----------------------------------------------
简单做人,认真做事。
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2019/12/8 13:24:38
91楼: 俺03年的时候做过,参考  UltraVNC 的方法。用 Delphi 做的。效率不是很高,但至少以那时候的 CPU 能力和那时候的网络带宽,能传。

现在来看,CPU 已经比较厉害了,如果压缩采用 H.264 来压缩图像,可能压缩后的数据量更小。当然 H.264 的压缩比较消耗 CPU,需要CPU足够好。

楼上有人说用显卡编程来做大数据量的图像运算,这个思路很好。但如果俺们仅仅用 Delphi 就搞不定了。
----------------------------------------------
-
作者:
男 bdl1 (bdl1) ▲▲▲▲▲ -
普通会员
2019/12/8 14:07:02
92楼: pcplayer 牛!
----------------------------------------------
-我的博客
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2019/12/8 16:33:56
93楼: 计算机图形学算法的范畴...早期的电视机成像原理...可以去参考下。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/4/13 15:03:13
94楼: 89 楼的文章我读了一下,确实是一个快速截屏的好技术。问题是如果要传输,则仍然需要想办法压缩数据。

压缩数据,如果能采用 GPU 当然就厉害了,节约 CPU 的时间。

采用 GPU,不知道在 DELPHI 底下,采用一些 OpenGL 的代码会不会最终计算是 GPU 计算?
----------------------------------------------
-
作者:
男 genius2005 (genius) ★☆☆☆☆ -
普通会员
2020/4/25 14:14:23
95楼: 94楼,目前已经有很多好的压缩算法,比如H264等,对于点对点,单播的话普通lz,zlib,gzip就能处理得特别好,如今的处理器运算与网络传输已经相当快了,压缩等不是啥大问题了。
----------------------------------------------
-
作者:
男 magiewang (magiewang) ▲▲▲△△ -
普通会员
2022/8/12 11:16:12
96楼: 天,2005年帖子被刨坑出来了。
----------------------------------------------
-
作者:
男 qq81709989 (战石电子) ▲▲△△△ -
普通会员
2023/8/9 20:59:07
97楼: // 抓屏逻辑

HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); 

int screenWidth = GetDeviceCaps(hScreenDC, HORZRES);
int screenHeight = GetDeviceCaps(hScreenDC, VERTRES);

HDC hMemDC = CreateCompatibleDC(hScreenDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, screenWidth, screenHeight);

HGDIOBJ hOldObj = SelectObject(hMemDC, hBitmap); 

BitBlt(hMemDC, 0, 0, screenWidth, screenHeight, hScreenDC, 0, 0, SRCCOPY); 

for (int i = 0; i < screenHeight; i++) {
  COLORREF* pixels = new COLORREF[screenWidth];
  
  GetBitmapBits(hBitmap, screenWidth * 4, pixels); 

  // 发送本行的像素数据pixels到远程

  delete [] pixels;
}

SelectObject(hMemDC, hOldObj);
DeleteDC(hMemDC);
DeleteObject(hBitmap);
DeleteDC(hScreenDC);

// 显屏逻辑  

HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);

// 接收远程发送来的像素数据到pixels

int screenWidth = GetDeviceCaps(hScreenDC, HORZRES);
int screenHeight = GetDeviceCaps(hScreenDC, VERTRES);

HDC hMemDC = CreateCompatibleDC(hScreenDC); 
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, screenWidth, screenHeight);

HGDIOBJ hOldObj = SelectObject(hMemDC, hBitmap);

for (int i = 0; i < screenHeight; i++) {

  // 获取第i行的像素数据pixels

  SetBitmapBits(hBitmap, screenWidth * 4, pixels); 

}

BitBlt(hScreenDC, 0, 0, screenWidth, screenHeight, hMemDC, 0, 0, SRCCOPY);

SelectObject(hMemDC, hOldObj);
DeleteDC(hMemDC); 
DeleteObject(hBitmap);
DeleteDC(hScreenDC);
可以用Delphi试着写一个高压缩率的自定义图像压缩算法,关键点包括:

分块编码
将图像分成多个小块,每个块单独压缩编码,可以提高压缩率。

色彩抽样
每隔几行几列取一个像素的颜色值,然后用这些颜色值来表示块内的主要色调。

差异编码
只编码相邻像素之间的颜色差值,而不是直接存储颜色值,减少冗余。

运动预估
如果是视频,可以根据前后帧预测当前帧的运动向量,只 coding 运动矢量。

熵编码
使用霍夫曼编码等统计方法,给出现频率高的符号分配更短的码字。
----------------------------------------------
《Z-Gantt智慧时间管理进度计划甘特图软件》:WWW.Z-SHi.NET
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行160.1563毫秒 RSS