声明:
Option Explicit
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
操作:
Dim Bytes() As Byte '图像缓冲区
Dim hScreen As Long '屏幕句柄
Dim hScene As Long '内存场景
Dim hBitmap As Long '屏幕图像
Dim BmpByte As Long '图像字节数
Dim W As Long, H As Long
'获得分辨率
W = Screen.Width \ Screen.TwipsPerPixelX
H = Screen.Height \ Screen.TwipsPerPixelY
'获得当前屏幕句柄
hScreen = GetDC(0)
'创建与当前屏幕一致的内存场景
hScene = CreateCompatibleDC(hScreen)
'创建与当前屏幕一致的位图
hBitmap = CreateCompatibleBitmap(hScreen, W, H)
SelectObject hScene, hBitmap
'把本机的即时屏幕图象复制到内存
BitBlt hScene, 0, 0, W, H, hScreen, 0, 0, vbSrcCopy
'显示内存图像
'StretchBlt hScreen, 0, 0, W - 2, H, hScene, 0, 0, W, H, vbSrcCopy
'将屏幕位图的二进制位复制到缓冲区
ReDim Bytes(W * H * 4)
BmpByte = GetBitmapBits(hBitmap, UBound(Bytes), Bytes(0))
to lingll(20分)
谢谢!
我编写了一个桌面共享程序,在S端把桌面传输到C端,如果每次都把整个屏幕传输过来速度非常慢,哪怕是压缩后。我采取把屏幕直接保存到数组(不保存成文件,避免读写硬盘耽误时间),然后发送。不理想的是数组也同样大(数组的大小等于屏幕分辨率*4),我不知道该如何压缩数组。以前在网上看过Delphi的一篇文章,说的就是采用差异传输法,把有过变化的部分传输过去。也就是我的数组比较,把相同的部分删除,但是必须保留剩余部分的索引,否则传输过去程序根本不知道把它显示在哪。
你的这种方法从根本上说就没有删除……