鉴于大家对DELPHI类作品十分关注,我们编辑小组在此为大家搜集整理了“DELPHI局域网监控系统的设计”一文,供大家参考学习
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
3.3.5 自定义控制协议标识符 客户端和管理端建立连接以后,客户端通过管理端操作界面上的每个功能按钮来对被监视电脑进行操作,这里要说明的是在这个程序里管理端向客户端发送的操作指令是自定义的控制协议标识符,用010、012等阿拉伯数字来表示,这些自定义标识符的作用就是管理端和客户端之间的协议,管理端通过发送这些标识符来告诉客户端该做什么。 管理端通过自定义函数ZhuDongCmdSend向客户端发送标识符,例如: procedure TMainForm.SpeedButton4Click(Sender: TObject); begin ZhuDongCmdSend(''093'', '''', false); end; 其中093就代表的是关机标识符 客户端收到093这个指令后在自己协议列表里寻找093这个指令的意思并进行操作: if RDStrList[0] = ''093'' then //关机 begin SOkz(1); exit; end; 当找到093为关机指令时,调用Sokz函数进行关机操作。 下面是对部分重要的自定义控制协议标识符进行说明: 文件管理: 010:删除文件或文件夹 011:新建文件 012:接收客户端传来的文件 013:发送文件到客户端 014:远程运行文件 进程管理: 020:刷新进程 021:结束进程 连接监视: 030:刷新窗口 031:显示窗口 032:隐藏窗口 033:关闭窗口 查看屏幕: 050:屏幕截取 090:禁止关机 091:允许关机 093:关机 094:注消 095:发送消息 3.4 主要功能的实现 3.4.1屏幕抓取的实现 当管理端与客户端建立连接时,如果客户端收到抓屏指令(050),客户端调用API函数GetWindowDC获取被监视电脑整个窗口的设备场景,再利用自定义函数My_GetScreenToBmp实现屏幕抓取。 截取图片为BMP格式,把BMP写入内存流中,然后把流发送给管理端。管理端接收到流后做相反操作,将流转BMP然后用ShowImageForm显示出来。 抓图代码: Procedure My_GetScreenToBmp(DrawCur:Boolean;StreamName:TMemoryStream); //自定义抓屏函数,DrawCur 表示抓鼠标图像与否 var Mybmp:Tbitmap; Cursorx, Cursory: integer; dc: hdc; Mycan: Tcanvas; R: TRect; DrawPos: TPoint; MyCursor: TIcon; hld: hwnd; Threadld: dword; mp: tpoint; pIconInfo: TIconInfo; begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := TCanvas.Create; {屏幕截取} dc := GetWindowDC(0); //得到一个句柄 try Mycan.Handle := dc; R:=Rect(0,0, Screen.Width,Screen.Height{GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)}); //样式设置 Mybmp.Width := R.Right; Mybmp.Height := R.Bottom; Mybmp.Canvas.CopyRect(R, Mycan, R); //COPY 结构 finally releaseDC(0, DC); end; Mycan.Handle := 0; Mycan.Free; if DrawCur then {画上鼠标图象} begin GetCursorPos(DrawPos); MyCursor := TIcon.Create; //创建一个对象 getcursorpos(mp); hld := WindowFromPoint(mp); Threadld := GetWindowThreadProcessId(hld, nil); AttachThreadInput(GetCurrentThreadId, Threadld, True); MyCursor.Handle := Getcursor(); AttachThreadInput(GetCurrentThreadId, threadld, False); GetIconInfo(Mycursor.Handle, pIconInfo); cursorx := DrawPos.x - round(pIconInfo.xHotspot); //得到坐标 cursory := DrawPos.y - round(pIconInfo.yHotspot); Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标} DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象} DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽} Mycursor.ReleaseHandle; {释放数组内存} MyCursor.Free; {释放鼠标指针} end; Mybmp.PixelFormat:=pf8bit; //256色 //Mybmp.SaveToFile(Filename); //保存对象 Mybmp.SaveToStream(StreamName); Mybmp.Free; end; 3.4.2进程管理的实现 通过Createtoolhelp32snapshot(Th32cs_snapprocess,0) )函数获取系统运行进程列表 ,再通过Process32First和Process32Next对系统中的所有进程进行枚举,并保存其信息 。 新建一个ProcessForm框体,设定框体的PopupMenu属性为PopupMenu1以便下面能进行添加PopupMenu1组件的操作。在框体上添加ListView组件,在ListView设定5个列,Caption分别为进程名、进程ID、线程数、优先级和父进程ID,再在框体上添加一个PopupMenu1组件(右键弹出菜单),设置TpopupMenu1的AutoPopup属性为true表示通过TPopupMenu的Popup方法来呼出菜单,添加“结束进程”和“刷新”为 PopupMenu1右键下拉菜单的2个功能。结束进程和刷新分别对应的自定义控制协议标识为021和020,管理端通过向客户端发送这2个指令来实现对进程的刷新和结束。 |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |