VB实现远程共享显示及声音.doc_第1页
VB实现远程共享显示及声音.doc_第2页
VB实现远程共享显示及声音.doc_第3页
VB实现远程共享显示及声音.doc_第4页
VB实现远程共享显示及声音.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VB实现远程共享显示及声音在局域网内共享调制解调器以及共享打印机都是我们非常熟悉的,而对于显示器和声卡的共享一般比较陌生。当你在进行教学、演示或展示时,也许你希望主控电脑上的画面同时也出现在其它电脑上;当你在跟踪调试程序时,你也许梦想过两台显示器能够同步,以便观看源代码时不破坏运行程序画面;还有,出于管理的目的,或许你需要远程监控其它电脑的运行状况,等等。上述所有情况都是远程共享显示的例子。共享声卡的需求也不少:首先这可以降低硬件投资,让没有装或者没法装声卡的电脑(如某些笔记本电脑)也有了“喉舌”;其次,即使每台机器都有声卡也不无用武之地:至少你的 mp3背景音乐与你的英语有声软件不再经常发生冲突了;还有,共享声卡使得“远程有声通知”成为可能,其作用类似于立即型声音邮件,在日常工作中有广泛的应用。 共享显示器或声卡的硬件(一般在扩展槽内插一块卡)在市场上不难找到。但扩充本文的示例程序即可以用软件轻松实现这些功能。一、共享显示我们通过一个完整的示例程序(VB 6.0)来说明。在例子中,被共享端(即服务器端)的任务是:自动捕获本机的当前显示画面,并将之传给共享端(即客户端)。 1. 服务器端程序(frmServer.frm) 这里有三点需要重点说明:一是自动捕获画面问题。为了模拟“捕获屏幕键”被按下的动作,程序里使用了 API调用 keybd_event。虽然VB的SendKeys语句也有类似功能,但它不如 keybd_event稳定和可靠。二是画面粘贴和压缩存储问题。为了能把已经被捕获到系统剪贴板中的图像粘贴下来并存储到文件,程序里使用了 ImgEdit控件。该控件强大的功能远非PictureBox控件或 Image控件可比。ImgEdit 不仅支持多种压缩图像格式(如 JPG、TIFF等),而且它对画面进行操纵和编辑的功能也非常强大(如图像旋转、缩放、嵌入等)。ImgEdit 还能对剪贴板进行Copy、Cut、Paste等操作。使用 Ctrl+T 或菜单(工程-部件)来添加 Windows标准的 ImgEdit控件(参见图一)。三是文件传输问题。用 ImgEdit存储的压缩文件一般只有 40 KB左右,使用 Winsock控件可以一次传输出去。但由于接收方的 Winsock控件一般是4K至8K调用一次 DataArrival子程,故程序使用主动分块进行传输,接收方确认后再发下一块。 服务器端源程序如下:frmServer.frm Option Explicit Const FileName = C:sys1.tmp, BlockSize = 3072 传送包大小 Private Declare Sub keybd_event Lib user32 _ (ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Sub Form_Load() tcpServer.LocalPort = 1001 设置监听端口号 tcpServer.Listen 开始监听 End Sub Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long) If tcpServer.State sckClosed Then tcpServer.Close tcpServer.Accept requestID tcpServer.SendData SH 成功连接后,发送“握手”信息 End Sub Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long) Static FileID As Integer, Cur_Pos As Long, FileLen As Long Dim strData As String, j Dim Buf() As Byte 定义一个可变大小的数组,用于传送二进制图像包 tcpServer.GetData strData Select Case strData Case Close 接到“Disconnect”命令后,关闭当前连接,并继续监听 tcpServer.Close ImgEdit1.ClearDisplay tcpServer.LocalPort = 1001 tcpServer.Listen Case Save Picture Call keybd_event(vbKeySnapshot, 1, 0, 0) 模拟按键操作 j = DoEvents() If Dir$(FileName) Then Kill FileName If ImgEdit1.IsClipboardDataAvailable Then 当剪贴板上有数据时 ImgEdit1.ClearDisplay ImgEdit1.DisplayBlankImage Screen.Width / _ Screen.TwipsPerPixelX, Screen.Height / _ Screen.TwipsPerPixelY, , , 6 ImgEdit1.ClipboardPaste 从剪贴板粘贴图像 ImgEdit1.BurnInAnnotations 0, 2 ImgEdit1.SaveAs FileName, 1, 6, 6, 256 另存图像。参数说明如下: “FileName”:文件名 参数“1”:TIFF 型文件; 第一个“6”:RGB24类型; 第二个“6”:JPEG压缩类型 参数“256”:最大压缩比 Clipboard.Clear tcpServer.SendData PS 发送“图像文件就绪”信息 End If Case Get Picture If Dir$(FileName) Then FileID = FreeFile Open FileName For Binary As #FileID 打开文件并发送第一块数据 FileLen = LOF(FileID) ReDim Buf(1 To BlockSize) As Byte Get #FileID, , Buf tcpServer.SendData Buf Cur_Pos = BlockSize End If Case Next Block If Cur_Pos = FileLen Then tcpServer.SendData EF 文件传送完毕后,发送“完成”信息 Close FileID Exit Sub End If j = Cur_Pos + BlockSize If j FileLen Then j = FileLen - Cur_Pos Else j = BlockSize End If ReDim Buf(1 To j) As Byte 动态确定数组大小 Get #FileID, , Buf tcpServer.SendData Buf 发送后续包 Cur_Pos = Cur_Pos + j End Select End Sub2. 客户端程序(frmClient.frm) 在窗体上建六个控件:一个名为 tcpClient的 Winsock控件用于通讯;一个名为txtIP 的 TextBox控件用于填写服务器的IP地址;一个名为ImgEdit1的 ImgEdit控件用于显示服务器传来的图像;三个CommandButton控件( cmdConnect、cmdGet_Pic和cmdDisconnect) 分别用于执行连接、取回图像和断开连接(见图二)。 客户端源代码如下: frmClient.frm Option Explicit Const FileName = C:sys1.tmp Private Sub cmdConnect_Click() If tcpClient.State sckClosed Then tcpClient.Close tcpClient.RemoteHost = txtIP.Text tcpClient.RemotePort = 1001 tcpClient.Connect 进行连接 End Sub Private Sub cmdDisconnect_Click() tcpClient.SendData Close 断开连接 cmdConnect.Enabled = True cmdGet_Pic.Enabled = False cmdDisconnect.Enabled = False End Sub Private Sub cmdGet_Pic_Click() tcpClient.SendData Save Picture 请求图像返回 frmClient.MousePointer = 11 End Sub Private Sub Form_Resize() 使 ImgEdit1 的大小随窗体的变化而变化 ImgEdit1.Height = frmClient.Height - 825 ImgEdit1.Width = frmClient.Width - 225 End Sub Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long) Static FileID As Integer, FileLen As Long Dim Buf() As Byte Dim j As Integer ReDim Buf(bytesTotal) As Byte 根据到达数据的字节数确定接收数组的大小 tcpClient.GetData Buf 收到连接完成的“握手”信息 If bytesTotal = 2 And Chr(Buf(0) = S And Chr(Buf(1) = H Then cmdConnect.Enabled = False cmdGet_Pic.Enabled = True cmdDisconnect.Enabled = True Exit Sub End If 收到图像就绪的信息 If bytesTotal = 2 And Chr(Buf(0) = P And Chr(Buf(1) = S Then If Dir$(FileName) Then Kill FileName FileID = FreeFile Open FileName For Binary As #FileID 打开文件,准备存储图像 FileLen = 0 tcpClient.SendData Get Picture Exit Sub End If 收到图像发送完毕的信息 If bytesTotal = 2 And Chr(Buf(0) = E And Chr(Buf(1) = F Then Close #FileID 关闭文件 j = DoEvents() ImgEdit1.Image = FileName ImgEdit1.Display 显示收到的图像 ImgEdit1.BurnInAnnotations 0, 2 frmClient.MousePointer = 0 Exit Sub End If 收到一块二进制图像信息 Put #FileID, , Buf 将当前数据块存盘 tcpClient.SendData Next Block 申请下一块 FileLen = FileLen + bytesTotal frmClient.Caption = TCP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论