首页 VisualBasic中创建多文档界面的

VisualBasic中创建多文档界面的

举报
开通vip

VisualBasic中创建多文档界面的用VB实现实时监控管理系统的开发技术DevelopingTechnologyofReal-timeMonitoringManagementSystemRealizedbyVB杜秀霞 李平康 甘旭军文 摘 在介绍新风机组实时监控管理系统应用软件功能的基础上,讨论了VisualBasic中“漂浮”文本框的应用技术、Grid网格控件的应用等软件开发过程中一些功能的实现方法,以及实时监控管理系统软件编程的技术和实用技巧。关键词 VB控件 数据采集 通讯 监控  随着科技的发展与计算机的普及,计算机控制在工程中的应用越来越广...

VisualBasic中创建多文档界面的
用VB实现实时监控管理系统的开发技术DevelopingTechnologyofReal-timeMonitoringManagementSystemRealizedbyVB杜秀霞 李平康 甘旭军文 摘 在介绍新风机组实时监控管理系统应用软件功能的基础上,讨论了VisualBasic中“漂浮”文本框的应用技术、Grid网格控件的应用等软件开发过程中一些功能的实现 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ,以及实时监控管理系统软件编程的技术和实用技巧。关键词 VB控件 数据采集 通讯 监控  随着科技的发展与计算机的普及,计算机控制在工程中的应用越来越广。Windows操作系统以其多任务、多界面等优点深受人们喜爱,而开发Windows环境下的应用软件也越来越被人们所重视。微软的VisualBasic(简称为VB)用来开发Windows环境下的应用软件十分方便,在VB环境下设计软件界面,编程工作量小,一般只需进行主要应用功能的编程和少量界面控制的编制。我们在开发新风机组实时监控管理系统中采用了VB软件,实现了上位机中实时监控管理系统的开发,所开发的程序流程图如图1所示。  本文在简要介绍新风机组监控系统构成的基础上,对如下的VB开发技术进行了讨论:  (1)使用网络(Grid)控件,实现电子表格的功能,在网格中显示采集到的数据。  (2)使用公共对话框(CommonButton)控件,实现文件的打印、存取功能。  (3)使用通讯(MSComm)控件,实现与下位机的通讯,以便对控制器进行数据采集、控制和管理。1 新风机组监控管理系统简介1.1 系统构成  新风机组控制系统包括:温度控制器、电动调节阀、热敏电阻温度传感器、压力开关、差压开关、过滤器、表冷器、风机、上位机监控软件等。控制对象是风机的开或关、理想阀位值、回水温度、输出状态等。控制的最终结果是:控制送风温度使其与设定温度相同。控制系统示意图如图2。图1 程序流程图图2 新风机组监控简图1.2 系统的 工作原理 数字放映机工作原理变压器基本工作原理叉车的结构和工作原理袋收尘器工作原理主动脉球囊反搏护理   新风机组引室外新风经表冷器进行冷热交换,将处理后的新风送至用户区域。  温度传感器检测送风温度T1,温度控制器将T1信号与设定温度比较,并利用“神经元”控制原理进行运算,其输出决定电动调节阀的输出状态,使表冷器的冷热水流量发生变化,从而使得送风温度等于设定温度。  温度控制器接收差压开关、压力开关信号及送风温度、回水温度信号,直接控制阀门开度。  上位机采用主从通讯方式与系统中全部温度控制器(本系统设定为不多于63台)构成简易集散系统,可监视每台温度控制器的运行状态。并可改变设定参数及实行远方手动操作。1.3 监控系统管理软件功能  实时监控管理软件是配合新风机组控制系统而编制的用微机对新风机组的整个系统及各个控制器进行监视和操作的应用软件,具有如下功能。  (1)监视功能  能对该新风机组控制系统的各个控制器的参数进行监视,在计算机上可以同时显示每台设备的季节、设定温度、阀位上下限指示、送风温度、入口差压、出口压力、输出状态、理想阀位、反馈阀位、占空比等参数。  (2)操作功能  能对一些参数进行设定,如:季节(冬或夏)、设定温度(5~40)℃、阀位上限(100)、阀位下限(0)。能实现手动操作功能,可在计算机屏幕上手动控制停风机,开风机,送理想阀位值直接控制阀位动作等。  (3)显示单一设备工况  可在计算机上显示温度控制器的运行状态,并将选定的单个设备的参数在画面中相应位置显示出来。  (4)保存及打印功能  在系统中提供了菜单的功能,菜单中除具有画面中一些命令框的功能外,还提供存取文件、打印文件的功能。能打开、显示原来运行过的、已存盘的文件,也可把此次运行的参数保存起来,另外还可打印出当前各个设备的参数。2 实时数据采集与管理2.1 实时数据采集  在VB语言的专业版本中提供了通讯控制(Communicationcontrol)控件,本应用软件应用通讯(MScomm)控件,实现了通过串行端口传递和接收数据的功能。  通讯(MScomm)控件功能强大,有很多特殊属性。可用它们来中断一个串行连结,检测一个载体并查询其当前状态;设置通讯标识;控制并行端口的选择;指定串行端口的有关设置,其中包括:握手、波特率、奇偶校验、数据位及停止位;建立并管理一个传送缓冲区;确定端口状态及解决奇偶校验问题。  该系统使用80C592单片机作为下位机,采集传感器测量的数据,经过一定处理后,通过RS485串行口将数据传送给上位PC机。在PC机上运行VB应用软件,接收串行口传来的数据,进行数据处理、显示、存盘、打印等。下面主要介绍对采集到的数据的显示处理及人机交互处理技术。2.2 网络(Grid)控件及应用  在应用程序中,需对大量实时数据进行管理,在程序设计过程中,使用了网格(Grid)控件的功能,而没有使用EXCEL电子表格软件。这是因为EXCEL软件是一个独立的应用软件,虽然有很强的功能,对表格的统计、显示、单元格数据的设定等,都很容易做到,但若在VB中使用了EXCEL软件,则该应用程序必需在有EXCEL的环境下才能运行,这样程序的运行就受到一定限制,而且这样编制的应用软件会很大。开发VB本身所带的网格(Grid)控件的功能,可起到电子表格的作用。  使用网格,可以按行和列顺序显示文本、数字和图片,就跟处理一个电子表格一样。可以调整网格的高度、宽度和其它显示特征。还可以对行和列进行个别操作,也可成组处理。  网格自动响应用户输入,允许用户移动有关网格和选择单个或成组的单元。  网格的Row和Col属性标明了当前活动着的网格单元的行和列。可以在程序代码中修改Row和Col的值,可以从网格的TEXT属性中读出单元的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 。  如:  Grid1.row=2∶Grid1.col=4∶  result$=Grid1.Text  就选中了Grid1网格的第二行和第四列。Result$就包含了当前单元(第二行的第四列)的内容。  一个网格还可以象电子表格一样有固定的行和列,FixedRows和FixedCols的值分别指明了固定行和列的数目。而Rows和Cols属性则分别指定了一个网格中行和列的总数目。  如:  Grid1.FixedRows=1∶  Grid1.FixedCols=1∶  Grid1.Rows=7∶Grid1.Cols=8  表明该网格具有7行8列,且有一个固定行和一个固定列。  从网格的CLIP属性中可读出涉及被选中区域的所有数据。数字和文本型数据通常都是按字符串数据存储在网格单元中的。  在设计的应用程序主画面中,使用了4个Grid(Grid1-Grid4)控件,组成系统画面。完成显示和设定不同参数的功能。  该画面由三部分组成,第一部分是控制按钮,分别由Command3D控件实现;第二部分是温度控制单元,由Grid1、Grid2控件实现。由于网格控件只能设计成规则的表格,所以这部分由两个网格来实现,网格一(Grid1)是一个具有1个固定行和1个固定列的64行17列的主表格,作为各种参数的主要显示单元,固定行显示参数名称(如:Adr、H/C、T0等),固定列显示地址号(如1、2、3等)。网格二(Grid2)是一个具有1个固定行,0个固定列的1行11列的副表格,作为主表格中参数名称的解释(如:地址、季节、设定温度等)。第三部分同第二部分一样由两个控件(Grid3、Grid4)来实现,只是显示内容为差压控制单元。  当网格单元的整个范围不适合在网格边界里面时,网格就需要设定滚动条,滚动条是由ScrollBars属性确定的。如  Grid1.ScrollBars=3,则使该网格既具有水平滚动又具有垂直滚动条。  若Grid1.ScrollBars=0,则该网格既没有水平滚动条又没有垂直滚动条。  在内部,网格是用“制表分隔符格式”(tab-delimitedformat)处理字符串数据的。即各单元的数据被制表符[Tab,Chr$(9)]分开,各行的数据被回车符[CR,Chr$(13)]分开。这种方式能很方便地把数据移入和移出网格,不论是一次一行数据还是一大段数据。  制表分隔符格式的方便之处还在于许多WINDOWS应用程序支持它,如:MicrosoftWord,Excel,WordPerfect等。如果把网格的内容保存在一个文本文件中,就可以用这类应用程序读这个文件。如:WINDOWS的电子表格程序Excel就能自动将数据转换到它自己的单元中,按表格方式显示出来。WINDOWS的字处理器AMIPRO,能清除制表符和CR字符,可以快速地将网格信息格式化成一个文本表。  该应用程序具有存取文件的功能,即对网格中的数据进行存取。存取功能利用网格的特点,如存文件时只要将按网格方式写好的数据,存成文本(TXT)格式的文件就可以了。取文件到网格中也很简单,当按照各单元之间以TAB键分开,各行之间以CR分开的格式组织文本文件后,就可以将该文件读到网格的相应单元中。  在网格单元中还保留了一个Picture属性,利用它,可以在网格中包含图片数据。2.3 飘浮的文本框  在该应用程序中,使用的网格控件除完成数据显示的功能外,还要对其单元的内容进行输入更新,实现人机交互功能。但网格控件的不足是不能在网格的单个单元中进行编辑。如果在运行时需要修改单元内容,就要在应用程序中增加一个控制,该应用程序采用了由程序代码将一个文本框与网格连接起来的方法。因要求这个单独为输入及编辑文本用的文本框控制在程序运行时不能被显示出来,所以采用了“漂浮”的文本框技术。  “漂浮”的文本框通常直到用户想编辑一个单元内容时才显示出来,用户可以用几种方式发出信号,以便编辑一个单元,如用鼠标连续两次击一个单元;按回车键,或只是从键盘中键入字母或数字。  当用户编辑一个单元时,把一个文本框控制直接放在该单元上,使文本框为可见状态,文本框与该单元有同样的尺寸与形状,结果用户看起来好象直接在单元中编辑,而实际是在文本框中。  确定文本框的准确大小及其放置的位置是很细致的,必须考虑到单元列的宽度,分隔各个单元线条的粗细度,以及网格本身与窗体的顶部和左边边界距离等。  在本程序中还使用了TwipsPerPixelX和TwipsPerPixelY这两个屏幕(SCREEN)属性,保证了文本框能准确地显示在单元边界内部。整个网格周围的边框和分隔各个单元的线条都只有一个象素宽。要把这些一个象素宽的线条统一考虑进整个网格和各个行、列中。TEXT1没有边框类型,所以文本框能很平滑地放在单元中(指配合得很好)用于编辑。结果就好象单元本身在修改,直到编辑过程已完成或被取消时为止。  当不编辑一个单元内容时,“漂浮”的文本框显示当前网格单元的内容。保持文本框中内容总是最新的最简单办法是使用网格的RowColChange事件过程。  每当当前的网格单元变化时,该事件过程就将当前网格单元的内容装入文本框的Text属性中。Grid1RowColChange事件过程代码如下:  SubGrid1RowColChange( )  Text1.Text=Gridl.Text  EndSub  “漂浮”的文本框要求有一些响应代码,以便确定何时编辑结束及如何响应编辑。击键的规则设置成,按Escape取消编辑,按回车、Tab或一个箭头键完成编辑。在Text1KeyPress事件过程中完成上述功能。  Text1KeyPress事件过程只能响应Escape、Tab及回车键,而文本框还要正确响应向上或向下箭头键的情况,这必须要在Text1KeyDown事件过程中来完成。2.4 文本框的其它使用技巧  (1)本应用程序中,在显示单一画面时,显示数字的文本框应设成只读,而且还要使汉字体为黑色,这就需要除了将文本框的Enabled属性设成False外,还要将Multiline属性设为True才能实现此功能。  (2)应用程序中,在输入参数时,要求所输入的参数必须为数字字符,而不能输入汉字、字母或其它字符,这就需要文本框具有识别数字字符和非数字字符的能力,在程序中,要将输入的非数字字符进行屏蔽。在SubText1KeyPress子程序中加入一段程序,即可实现这一功能。  (3)在文本框中,输入字符的最大长度应为32768,若对所设置的文本框进行字符限制,可以使用MaxLength属性,若为0则表示可以接受任意多的字符(小于32768),若设置为非零数值,则将用户输入字符限制在该数值范围内。如在本程序中,需要设置口令,将其定为三位数,则MaxLengrh=3。  在用文本框设置口令时,希望所输入的字符别人无法看到,这就要用到PasswordChar属性。若该属性设置为一个字符,如星号(),当键入任何字符时,都将显示该星号字符,实际上,文本框的内容还是刚输入的文本,改变的只是显示的内容。3 结束语  本文在介绍新风机组监控系统上位机功能的基础上,介绍了用VB开发功能软件的一些技术实践和体会,如漂浮文本框技术,网格控件的使用等。所开发的应用软件在新风机组的控制中,起到了管理和监控的功能,对新风机组的正常运行起到了良好的监控作用。作者单位: 北京高等电力专科学校(北京100044)VB中设计多文档界面应用程序的简单示例  【例】设计一个包含一个MDI父窗体MDIForm1和三个子窗体Form1、Form2和Form3的工程,将Form1、Form2和Form3的MDIChild属性分别设置为True。在MDI窗体上设计菜单,主菜单及子菜单如图1a和图1b所示。  “打开”菜单下的三个菜单项分别用于打开子窗体Form1、Form2和Form3,“窗口”菜单下的菜单项用于对打开的窗体进行各种排列。         a)"打开"菜单                 b)"窗口"菜单                     图1MDIForm1中的菜单  MDIForm1的菜单编辑器设置如下表所示。表MDIForm1的菜单编辑器设置标  题名  称索  引显示窗口列表说  明 打开 Mopen    ...窗口1 ...窗口2 ...窗口3 SWindow1 SWindow2 SWindow3    窗口 MWindows  √ 显示打开的窗口列表 ...层叠 ...水平平铺 ...垂直平铺 ...排列图标 SArrange SArrange SArrange SArrange 0 1 2 3  控件数组代码如下:PrivateSubSArrange_Click(IndexAsInteger)   MDIForm1.ArrangeIndexEndSubPrivateSubSWindow1_Click()   Form1.ShowEndSubPrivateSubSWindow2_Click()   Form2.ShowEndSubPrivateSubSWindow3_Click()   Form3.ShowEndSub  运行时,使用“打开”菜单下的各命令打开各窗口,再选择“窗口”菜单下“水平平铺”,执行效果如图2a所示,这时的“窗口”菜单下显示了当前打开的窗口列表,如图2b所示。       a)水平平铺各子窗口              b)显示当前打开的窗口列表                  图2在MDI父窗口中打开多个子窗口在VisualBasic中创建多文档界面的步骤  在VisualBasic中创建多文档界面的步骤如下:  1)打开“工程”菜单,选择“添加MDI窗体”,打开“添加MDI窗体”对话框。  2)在“添加MDI窗体”对话框中选择“新建”选项卡,再选择“MDI窗体”,然后单击“打开”按钮,添加一个新的MDI父窗体(MDIForm对象)。一个应用程序只能有一个MDI父窗体。多数控件不能放在MDI窗体上,除非控件具有Align属性(如PictureBox控件)或者运行时不可见(如Timer控件)。可以在MDI父窗体上设计应用程序的菜单、工具栏、状态栏。  3)用与建立普通窗体相同的方法建立其他子窗体,设置各子窗体的MDIChild属性为True。在设计子窗体时,可以像设计普通窗体一样添加控件、设置属性、编写代码完成各种功能。  4)选择“工程”菜单下的“工程属性”命令,打开“工程属性”对话框,从“启动对象”下拉列表中选择MDIForm对象。如果“启动对象”不是MDIForm对象,而是某个子窗体,则运行时会自动显示MDI父窗体和该子窗体。  5)要在MDIForm对象中显示各子窗体,可以使用Show方法。  当在MDI父窗体中同时显示多个子窗体时,可以使用Arrange方法重排MDI子窗体或图标。使用格式为:  .Arrange<排列方式>  其中,<排列方式>可以有以下选择:  vbCascade或0:层叠所有非最小化的MDI子窗体。  vbTileHorizontal或1:水平平铺所有非最小化的MDI子窗体。  vbTileVertical或2:垂直平铺所有非最小化的MDI子窗体。  vbArrangeIcons或3:重排最小化的MDI子窗体的图标。用VB编写监视指定进程的程序所属类别:HYPERLINK"http://www.programbbs.com/doc/class7-1.htm"VB推荐指数:★★☆文档人气:698本周人气:1发布日期:2007-5-28作者:徐原   一、前言 有些对外营业的公司在大厅中都有一个触摸屏,以供客户查询公司的信息,可是通常查询HYPERLINK"http://www.programbbs.com/doc/"程序都很大,而且很复杂,这样在连续长时间使用后难免会出现错误以致HYPERLINK"http://www.programbbs.com/doc/"程序中途退出,这时就要工作人员来重新启动那个HYPERLINK"http://www.programbbs.com/doc/"程序,而且有时候很忙不一定能有专人守在这个地方。其实可以用一个HYPERLINK"http://www.programbbs.com/doc/"程序来专门处理这种情况的。我们局电信营业前台的多媒体查询系统也常常会出现这样的问题,下面是本人开发出来的监控HYPERLINK"http://www.programbbs.com/doc/"程序处理思路。 二、实现思路及关键技术 要防止HYPERLINK"http://www.programbbs.com/doc/"程序中途退出,就需要另外的一个HYPERLINK"http://www.programbbs.com/doc/"程序专门对要监控的进程进行时刻不停的监控,检测到被监控的进程退出了就重新启动它。但是有时候可能是操作系统出了问题,不能简单地重复启动要监控的进程,在重启了一定的次数后被监控进程仍然退出,那就需要重新启动操作系统了,以便使操作系统中的环境参数等重新初始化,然后再运行监控进程并启动被监控的进程。 监控进程的存在最好不能影响被监控的进程,监控进程启动的时候要进行判断,看当前状况下被监控的进程有没有起来,如果起来了就获取其进程句柄并进行监控,如果没有起来则使之起来并监控。这里判断一个被监控的进程有没有起来不能简单地通过查找窗口标题来实现,因为窗口标题在HYPERLINK"http://www.programbbs.com/doc/"程序内部可能是根据运行的时刻和条件动态地改变的,而且别的进程也可以和可能去改变被监控进程的窗口标题。HYPERLINK"http://www.programbbs.com/doc/"程序中使用了CreateToolhelp32SnapShot()这个API函数遍历系统进程池里的所有进程全路径等信息来查找的,一个进程运行起来之后,它的路径是不可能被改变的,无论它自己还是别的进程。 为了实现HYPERLINK"http://www.programbbs.com/doc/"程序的高效率,这里监控进程不是用TimerHYPERLINK"http://www.programbbs.com/com/"控件轮寻来检测,而是用API函数WaitForSingleObject(),同时传入等待时间为无限长(-1),但是这里有个问题,就是HYPERLINK"http://www.programbbs.com/doc/"程序在等待的同时被冻结,这样用户在这个时候就无法对该监控HYPERLINK"http://www.programbbs.com/doc/"程序进行设置操作了,为了避免这种情况,这里使用了多线程技术,在VB中使用多线程一直是不安全的,在线程代码中必须不能出任何错误。 要使监控进程能自动启动操作系统,必须要在系统启动的登陆对话框出现的时候该进程也能运行起来,这可以通过把该进程放入注册表项HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\RunSevices里来实现。在进程运行起来之后就需要检测登陆对话框,如果找到就发送回车(这里没设登陆密码,如果有密码,可以修改HYPERLINK"http://www.programbbs.com/doc/"程序中发送的按键来实现登陆)。但是这里也有可能是登陆的时候系统设置的不是“网络用户”方式或有用户在屏幕上按了“确定”对话框,HYPERLINK"http://www.programbbs.com/doc/"程序不能这这里一直等待一个不可能的事件,所以要在这个地方加以判断,如果等了1分钟没有找到登陆对话框,HYPERLINK"http://www.programbbs.com/doc/"程序就继续下面的操作。 三、代码示例 模块中: PublicTypePROCESSENTRY32’ 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 进程信息的结构 dwSizeAsLong cntUsageAsLong th32ProcessIDAsLong th32DefaultHeapIDAsLong th32ModuleIDAsLong cntTreadsAsLong th32ParentProcessIDAsLong pcPriClassBaseAsLong dwFlagsAsLong szExeFileAsString*260’这就是包含全路径的进程文件名 EndType PublicDeclareFunctionProcess32FirstLib"kernel32"(ByValhSnapshotAsLong,lppeAsPROCESSENTRY32)AsLong’用来遍历进程池的函数,这是查找的起始函数 PublicDeclareFunctionProcess32NextLib"kernel32"(ByValhSnapshotAsLong,lppeAsPROCESSENTRY32)AsLong’遍历进程池的向下递归函数 PublicTypeSTARTUPINFO’记录进程启动信息的结构 cbAsLong lpReservedAsString lpDesktopAsString lpTitleAsString dwXAsLong dwYAsLong dwXSizeAsLong dwYSizeAsLong dwXCountCharsAsLong dwYCountCharsAsLong dwFillAttributeAsLong dwFlagsAsLong wShowWindowAsInteger cbReserved2AsInteger lpReserved2AsByte hStdInputAsLong hStdOutputAsLong hStdErrorAsLong EndType PublicTypePROCESS_INFORMATION’记录进程启动后相关信息的结构 hProcessAsLong’进程句柄 hThreadAsLong’线程句柄 dwProcessIdAsLong’进程ID dwThreadIdAsLong’线程ID EndType PublicDeclareFunctionGetCurrentProcessLib"kernel32"()AsLong’获取当前进程句柄 PublicDeclareFunctionGetCurrentProcessIdLib"kernel32"()AsLong;获取当前进程ID PublicConstTH32CS_SNAPPROCESS=AsLongH2 PublicDeclareFunctionWaitForSingleObjectLib"kernel32"(ByValhHandleAsLong,ByValdwMillisecondsAsLong)AsLong PublicDeclareFunctionExitWindowsExLib"user32"(ByValuFlagsAsLong,ByValdwReservedAsLong)AsLong PublicDeclareFunctionRegisterServiceProcessLib"kernel32"(ByValdwProcessIdAsLong,ByValdwTypeAsLong)AsLong PublicDeclareFunctionGetModuleFileNameLib"kernel32"Alias"GetModuleFileNameA"(ByValhModuleAsLong,ByVallpFileNameAsString,ByValnSizeAsLong)AsLong PublicDeclareFunctionRegSetValueExLib"advapi32.dll"Alias"RegSetValueExA"(ByValhKeyAsLong,ByVallpValueNameAsString,ByValReservedAsLong,ByValdwTypeAsLong,ByVallpDataAsString,ByValcbDataAsLong)AsLong PublicDeclareFunctionRegCloseKeyLib"advapi32.dll"(ByValhKeyAsLong)AsLong PublicDeclareFunctionRegOpenKeyLib"advapi32.dll"Alias"RegOpenKeyA"(ByValhKeyAsLong,ByVallpSubKeyAsString,phkResultAsLong)AsLong PublicDeclareFunctionGetWindowLib"user32"(ByValhwndAsLong,ByValwCmdAsLong)AsLong PublicDeclareFunctionGetWindowTextLib"user32"Alias"GetWindowTextA"(ByValhwndAsLong,ByVallpStringAsString,ByValcchAsLong)AsLong PublicDeclareFunctionGetWindowTextLengthLib"user32"Alias"GetWindowTextLengthA"(ByValhwndAsLong)AsLong PublicDeclareFunctionCreateProcessLib"kernel32"Alias"CreateProcessA"(ByVallpApplicationNameAsString,ByVallpCommandLineAsString,ByVallpProcessAttributesAsLong,ByVallpThreadAttributesAsLong,ByValbInheritHandlesAsLong,ByValdwCreationFlagsAsLong,lpEnvironmentAsAny,ByVallpCurrentDriectoryAsString,lpStartupInfoAsSTARTUPINFO,lpProcessInformationAsPROCESS_INFORMATION)AsLong PublicDeclareFunctionGetSystemMenuLib"user32"(ByValhwndAsLong,ByValbRevertAsLong)AsLong PublicDeclareFunctionRemoveMenuLib"user32"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong)AsLong PublicDeclareFunctionDrawMenuBarLib"user32"(ByValhwndAsLong)AsLong PublicDeclareFunctionGetMenuItemCountLib"user32"(ByValhMenuAsLong)AsLong PublicDeclareFunctionResumeThreadLib"kernel32"(ByValhThreadAsLong)AsLong PublicDeclareFunctionSuspendThreadLib"kernel32"(ByValhThreadAsLong)AsLong PublicDeclareFunctionCreateThreadLib"kernel32"(ByVallpThreadAttributesAsLong,ByValdwStackSizeAsLong,ByVallpStartAddressAsLong,ByVallpParameterAsLong,ByValdwCreationFlagsAsLong,lpThreadIdAsLong)AsLong PublicDeclareFunctionTerminateProcessLib"kernel32"(ByValhProcessAsLong,ByValuExitCodeAsLong)AsLong PublicDeclareFunctionTerminateThreadLib"kernel32"(ByValhThreadAsLong,ByValdwExitCodeAsLong)AsLong PublicConstPROCESS_TERMINATE=&H1 PublicConstPROCESS_QUERY_INFORMATION=&H400 PublicConstEWX_FORCE=4 PublicConstEWX_REBOOT=2 PublicConstGW_CHILD=5 PublicConstGW_HWNDFIRST=0 PublicConstGW_HWNDNEXT=2 PublicConstGW_MAX=5 PublicConstGW_OWNER=4 PublicConstHKEY_LOCAL_MACHINE=&H80000002 PublicConstREG_SZ=1 PublicConstRSP_SIMPLE_SERVICE=1 PublicConstRSP_UNREGISTER_SERVICE=0 PublicConstCREATE_SUSPENDED=&H4 PublicConstMF_BYPOSITION=&H400 PublicConstBM_CLICK=&HF5 PublicpeAsPROCESSENTRY32,hSnapshotAsLong PublicStartNumAsLong,AppNameAsString,SectionAsString,sKeyAsString,appValueAsString,sKeyFileAsString,sKeyNumAsString PublicNumTerminateAsLong,hThreadAsLong,ThreadIDAsLong,sFileNameAsString PublicFunctionStartMonitor(lParamAsLong)AsLong’线程函数 WaitForTheProcessGetProcessHandle(sFileName),sFileName’开始监控 StartMonitor=1 EndFunction PublicFunctionSendEnterAsLong()’搜寻系统登陆对话框,找到就发送回车键 DimCurrwndAsLong,LengthAsLong,ListItemAsString Currwnd=GetWindow(Form1.hwnd,GW_HWNDFIRST)’这里用窗口标题查找的原因是系统重启时基本上不会加载多少进程,这样窗口的标题通常是不会被改变的。 WhileCurrwnd<>0 Length=GetWindowTextLength(Currwnd)’获取窗口标题字符串的长度。 IfLength<>0Then ListItemAsString=SpaceAsString(Length) Length=GetWindowText(Currwnd,ListItemAsString,Length+2)’获取窗口标题 IfInStr(ListItem,"输入网络密码")<>0Then EnumChildWindowsCurrwnd,AddressOfGetOkButton,0 SendEnter=1 ExitFunction EndIf EndIf Currwnd=GetWindow(Currwnd,GW_HWNDNEXT) Wend SendEnter=0 EndFunction PublicSubWaitForTheProcess(ByValhProcessAsLong,ByValsPathAsString)’开始监控进程 DimPro_InfoAsPROCESS_INFORMATION,StartInfoAsSTARTUPINFO StartInfo.cb=Len(StartInfo) IfhProcess>0Then’如果已经运行了被监控进程则开始监控 DimWaitResultAsLong WaitResult=WaitForSingleObject(hProcess,(-1)) CloseHandlehProcess IfStartNum>=NumTerminateThen’如果重启次数超过设置的次数就重新启动系统 SaveSettingAppName,Section,sKey,"1" ExitWindowsExEWX_REBOOTOrEWX_FORCE,0’强制退出,这样可以顺利退出 ExitSub EndIf StartNum=StartNum+1 Form1.Label6=StartNum EndIf CreateProcessvbNullString,sPath,0,0,True,32,ByVal0AsLong,vbNullString,StartInfo,Pro_Info’否则用被监控进程的全路径文件名来创建被监控进程 WaitForTheProcessPro_Info.hProcess,sPath EndSub PublicFunctionGetProcessHandleAsLong(ByValsPathAsString)’获取被监控进程的进程句柄 sPath=LCase(sPath) hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)’创建一个snapshot对象 pe.dwSize=Len(pe) bValue=Process32First(hSnapshot,pe)’开始遍历系统进程池 WhilebValue<>0 IfInStr(LCase(pe.szExeFile),sPath)<>0Then’如果找到了,则… DimhProcessAsLong hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,0,pe.th32ProcessID) GetProcessHandle=hProcess CloseHandlehSnapshot ExitFunction EndIf bValue=Process32Next(hSnapshot,pe) Wend CloseHandlehSnapshot GetProcessHandle=0’否则返回0 EndFunction PublicFunctionGetOkButton(ByValhwndAsLong,ByVallParamAsLong)AsLong’获取“输入网络密码框”窗口中“确定”按钮的句柄 DimLength&,ListItem$ Length=GetWindowTextLength(hwnd) IfLength<>0Then ListItem$=Space$(Length) Length=GetWindowText(hwnd,ListItem$,Length+2) IfInStr(ListItem,"确定")<>0Then SendMessagehwnd,BM_CLICK,0,0’激活窗口 SendMessagehwnd,BM_CLICK,0,0’发送Click消息 GetOkButton=0’退出EnumChildWindows()函数的枚举循环 ExitFunction EndIf EndIf GetOkButton=1’继续EnumChildWindows()函数的枚举循环 EndFunction 窗口中有几个LabelHYPERLINK"http://www.programbbs.com/com/"控件: Label2用来提示当前被监控的进程的,Label4和Label6用来记录次数的。窗口中还有一个菜单,用来向用户提供设置方法的。因为允许操作人员设置,不能隐藏窗口,所以这里隐藏了菜单,在窗口上用鼠标点右键才能看见,而触摸屏上顾客是无法点右键的,这样设置就安全了,具体的菜单项见下面HYPERLINK"http://www.programbbs.com/doc/"程序: 作者:安徽省滁州市电信局小型机房徐原 来自:计算机世界网PrivateSubForm_Load() RegisterServiceProcessGetCurrentProcessId,RSP_SIMPLE_SERVICE’注册进程为系统服务进程,这样进程只在系统关机的最后一刻才从系统中卸掉。 DimFNAsString,hRegAsLong,tRegKeyAsString,tSubKeyAsString,phkResultAsLong,lpSubKeyAsString,EnterResultAsLong DimTimePassed1AsLong,TimePassed2AsLong FN=Space(255) GetModuleFileNameApp.hInstance,FN,255’获取当前进程的全路径文件名 FN=Trim(FN) lpSubKey="Sysexplor" tSubKey="SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices" RegOpenKeyHKEY_LOCAL_MACHINE,tSubKey,phkResult’打开注册表项 RegSetValueExphkResult,lpSubKey,0,REG_SZ,FN,Len(FN)’写当前进程的全路径到上面所说的注册表项中,以便下次系统重启说能和系统登陆对话框一同运行 RegCloseKeyphkResult’关闭注册表项 AppName="TiMonitor" Section="Reboot" sKeyFile="FileName" sFileName=GetSetting(AppName,Section,sKeyFile,"")’读取注册表中记录的被监控进程的全路径名 aa:IfLen(Dir(sFileName,vbDirectory))<4Then sFileName="c:\teleinfo\ti.exe"’如果读取不到或系统不存在相应的文件,则取一个默认值。或者给一个提示: 'sFileName=InputBox("找不到HYPERLINK"http://www.programbbs.com/doc/"程序,请输入包含全路径的HYPERLINK"http://www.programbbs.com/doc/"程序名:","输入","C:\teleinfo\ti.exe") 'Gotoaa EndIf Label2=sFileName sKey="Once" appValue=GetSetting(AppName,Section,sKey,"0")’判断该进程起的时候是系统重新启动时还是在运行过程中启动 IfappValue="1"Then DeleteSettingAppName,Section,sKey’如果是,删除系统重启标志 TimePassed1=GetTickCount Do DoEvents EnterResult=SendEnter() TimePassed2=GetTickCount IfTimePassed2-TimePassed1>60000ThenExitDo’超时1分钟就退出该循环 LoopUntilEnterResult<>0 EndIf sKeyNum="TerminateNumbers" appValue=GetSetting(AppName,Section,sKeyNum,"4")’读取注册表中被监控进程重启次数的设置信息 NumTerminate=Val(appValue) StartNum=0 Label4=NumTerminate Label6=0 DimhMenuAsLong,lParamAsLong,MenuCountAsLong,iAsLong hMenu=GetSystemMenu(hwnd,0)’为了不能让顾客关闭监控进程,这里屏蔽了相关的系统菜单 MenuCount=GetMenuItemCount(hMenu) Fori=0ToMenuCount-1 RemoveMenuhMenu,i,MF_BYPOSITION Next DrawMenuBarhwnd hThread=CreateThread(0,2000,AddressOfStartMonitor,lParam,0,ThreadID)’创建一个监控线程 EndSub PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle) IfButton=2ThenPopupMenumunSet’弹出设置菜单 EndSub PrivateSubmunClose_Click() TerminateProcessGetCurrentProcess,1’关闭自己,因为系统菜单的关闭被屏蔽了,只能在HYPERLINK"http://www.programbbs.com/doc/"程序中自己提供方法来关闭,又因为是多线程的,不能仅仅用UnloadMe来关闭,那只是关闭了一个线程,而监控线程没有被关闭,这里直接把当前进程给关闭了,这样可同时关闭进程中所有运行的线程。 EndSub PrivateSubmunPause_Click()’这是一个有Check标记的菜单,用来Pause和Resume线程的 IfmunPause.CheckedThen munResume.Checked=True ResumeThreadhThread Else munResume.Checked=False SuspendThreadhThread EndIf munPause.Checked=NotmunPause.Checked EndSub PrivateSubmunResume_Click() IfmunResume.CheckedThen munPause.Checked=True SuspendThreadhThread Else munPause.Checked=False ResumeThreadhThread EndIf munResume.Checked=NotmunResume.Checked EndSub PrivateSubmunSetFile_Click()’设置要监控进程的全路径名 DimrFileNameAsString rFileName=InputBox("请输入要监控进程的全路径名:","输入",sFileName) IfLen(Trim(rFileName))<4ThenExitSub’输入明显不对,就不作任何保存直接退出该过程 IfLen(Dir(rFileName,vbArchive))>4Then sFileName=rFileName SaveSettingAppName,Section,sKeyFile,sFileName’保存正确设置 Label2=sFileName DimbPausedAsLong IfMsgBox("重新开始监控进程吗?",vbYesNo)=vbYesThen’询问是否立刻转到监控新的进程 TerminateThreadhThread,1 CloseHandlehThread StartNum=0 Label6="0" bPaused=IIf(munPause.Checked,CREATE_SUSPENDED,0) hThread=CreateThread(0,2000,AddressOfStartMonitor,0,bPaused,ThreadID)’如果窗口菜单上这时设置了Pause,则这时也创建一个Suspend线程,以便和菜单保持一致。 EndIf EndIf EndSub PrivateSubmunSetTimes_Click() DimNumTAsString NumT=InputBox("请输入要重启进程的最大次数:","输入",NumTerminate)’设置被监控进程重启的最大次数 IfTrim(NumT)=""ThenExitSub’如果操作人员选择“取消”或输入空格,则本次修改无效 NumTerminate=Val(Trim(NumT)) SaveSettingAppName,Section,sKeyNum,Trim(NumT)’保存有效设置 Label4=NumTerminate EndSub 该HYPERLINK"http://www.programbbs.com/doc/"程序在VB5.0、Windows98下运行通过。 注意,该HYPERLINK"http://www.programbbs.com/doc/"程序不要进行调试,因为VB本身是单线程的,不支持多线程的调试,只能编译好后运行,或者一个一个分开调试,再合到一起。 结束语: 随着科技的发展,办公自动化的流行,很多公司摆脱了老的办公机制,都使用了计算机来流水型自动执行很多以前需要人去手工执行的工作,但是这些HYPERLINK"http://www.programbbs.com/doc/"程序因为处理的东西比较多,代码比较复杂,常常HYPERLINK"http://www.programbbs.com/doc/"程序中会有一些小小的Bug,这些Bug有时会导致在自动化过程中HYPERLINK"http://www.programbbs.com/doc/"程序被意外地关闭,致使流水线的中断,上面的这个HYPERLINK"http://www.programbbs.com/doc/"程序可以帮助解决这个问题。 该HYPERLINK"http://www.programbbs.com/doc/"程序在无人职守但又需要维持一个进程时刻执行的地方都适用。
本文档为【VisualBasic中创建多文档界面的】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
仙人指路888
暂无简介~
格式:doc
大小:142KB
软件:Word
页数:28
分类:小学语文
上传时间:2022-08-19
浏览量:1