socket应用(二) 用C语言写远程屏幕监视程序

前一段时间写了一个可以远程监视对方屏幕的程序,拿来分享。关键代码在资源里 http://download.csdn.net/user/sophisticated

      该系统采用服务器和客户端模式。

      首先是服务器和客户端的连接,这一部分在(socket应用一)中已经详细说明了,不再详述。

      接下来就是数据的发送和接收了,服务器负责采集屏幕信息,向客户端发送,客户端负责接收数据,将其显示在屏幕上。

      服务器端:首先是屏幕信息的采集,调用系统API【GetDC】,参数传入桌面窗口的句柄,即【GetDesktopWindow】的返回值,得到屏幕的DC,为了将数据保存下来以便操作,在内存中创建一个兼容DC,调用函数【CreateCompatibleDC】,将上面得到的DC作为参数传入,得到兼容DC的句柄。其实如果不是要传输而是在本地窗口上显示屏幕的话,就不用创建兼容DC,而直接调用【StretchBlt】就可以显示桌面了。为了得到位图信息,还得创建一个兼容位图,这个位图是用来保存屏幕位图的信息的,存在于内存中,其实屏幕的显示就是一幅位图,这幅位图保存在屏幕窗口的DC中,我们要做的就是将这幅位图复制出来,放到我们创建的兼容DC,即内存DC中,然后发送出去。创建兼容位图要调用【CreateCompatibleBitmap】,传入参数依然为屏幕DC,得到兼容位图的句柄。为了使兼容DC和兼容位图联系起来,我们调用【SelectObject】将其选入兼容DC中,下来就是要复制屏幕DC中的位图到兼容DC中了,调用【StretchBlt】,下来还要得到位图的基本信息,这是为了客户端显示的方便,调用【GetObject】,传入兼容位图句柄,然后填充BITMAPINFOHEADER结构,填充完成后就可以发送了,发送时分配一块大小为sizeof(BITMAPINFOHEADER)+bi.biSizeImage大小的内存,先将BITMAPINFOHEADER结构复制到该内存中【memcpy】,然后后面该跟上具体数据了,调用【GetDIBits】,缓冲区参数传入lp+sizeof(BITMAPINFOHEADER),这里lp为分配内存的指针,然后就可以调用【send】,将lp作为参数传递进去发送了。

    客户端:很简单,受到数据后,调用【GetClientRect】得到程序窗口的大小,调用【GetDC】得到窗口的DC,再调用【StretchDIBits】复制到窗口即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值