赞 | 445 |
VIP | 56 |
好人卡 | 75 |
积分 | 411 |
经验 | 124650 |
最后登录 | 2024-9-28 |
在线时间 | 7570 小时 |
Lv5.捕梦者 (管理员) 老黄鸡
- 梦石
- 0
- 星屑
- 41136
- 在线时间
- 7570 小时
- 注册时间
- 2009-7-6
- 帖子
- 13498
|
本帖最后由 fux2 于 2011-11-2 17:38 编辑
熊猫 发表于 2011-11-2 17:09
你检查一下CopyMemory后数组是否是正好俩拼在一起。是不是一些数据改变了。
如果数据有变化,就是CopyMem ...
于是直接帖代码吧。
客户端的发送部分是这样的.- Private Sub CaptureScreen()
- Dim ScreenHDC As Long
- Dim size As Long
- Dim s As String
- Dim hIconMouse As Long
- Dim ICONINFO As ICONINFO
- Dim Pt As POINTAPI
- On Error GoTo ErrProc
-
- If SendOK Then
- SendOK = False
- '拷屏
- ScreenHDC = GetDC(0)
- WinAPI.BitBlt mHDC, 0, 0, w, h, ScreenHDC, 0, 0, WinAPI.SRCCOPY
- '压缩
- With jpg
- .Quality = 10
- .SampleHDC mHDC, w, h
- buff() = .SaveData()
- End With
- '发送本幅图像数据长度
- size = UBound(buff()) - LBound(buff())
- s = "|SIZE:|" & CStr(size)
- Winsock1.SendData s
- DoEvents
- Sleep 20
- '发送图像数据
- Winsock1.SendData buff()
- DoEvents
- Erase buff()
- WinAPI.ReleaseDC 0, ScreenHDC
- End If
- Exit Sub
- ErrProc:
- Winsock1.Close
- Timer1.Enabled = False
- SendOK = True
- ResetNetConnect
- Exit Sub
- End Sub
复制代码 接收端代码- Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
- On Error Resume Next
- Static p As Long
- Static recv As Boolean
- Dim buff() As Byte
- Dim s As String
- Static lenght As Long
- Winsock1.GetData buff()
- If Not recv Then
- s = StrConv(buff(), vbUnicode)
- If InStr(1, s, "size", vbTextCompare) >= 1 And bytesTotal < 20 Then
- Dim cmd() As String
- cmd() = Split(s, "|")
- lenght = CLng(cmd(2))
- recv = True
- p = 1
- End If
- Else
- Put #2, p, buff()
- CopyMemory szfile(p), buff(1), (UBound(buff()) + 1 - LBound(buff()))
- p = p + (UBound(buff()) + 1 - LBound(buff()))
- If p >= lenght Then
- szfile(0) = &HFF
- Open App.Path & "/asfd.jpg" For Binary As #1
- Put #1, , szfile()
- Close #1
- Close #2
- recv = False
- lenght = 0
- p = 0
- myPaintPicture
- Close
- Unload Form1
- End
- End If
- End If
- NewClient = True
- Exit Sub
- End Sub
复制代码 这里的#2输出一张qq.jpg,图像正常
asfd是字节数组szfile输出的图像,都是花的= =,貌似哪里有错位,但没发现. |
|